diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java index 23675e37b..e7bf48690 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/IterUtil.java @@ -5,6 +5,7 @@ import cn.hutool.core.lang.Filter; import cn.hutool.core.lang.func.Func1; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; @@ -16,6 +17,7 @@ import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.function.Function; /** * {@link Iterable} 和 {@link Iterator} 相关工具类 @@ -457,6 +459,82 @@ public class IterUtil { return resultMap; } + /** + * 将列表转成值为List的HashMap + * + * @param iterable 值列表 + * @param keyMapper Map的键映射 + * @param 键类型 + * @param 值类型 + * @return HashMap + */ + public static Map> toListMap(Iterable iterable, Function keyMapper) { + return toListMap(iterable, keyMapper, v -> v); + } + + /** + * 将列表转成值为List的HashMap + * + * @param iterable 值列表 + * @param keyMapper Map的键映射 + * @param valueMapper Map中List的值映射 + * @param 列表值类型 + * @param 键类型 + * @param 值类型 + * @return HashMap + */ + public static Map> toListMap(Iterable iterable, Function keyMapper, Function valueMapper) { + final HashMap> resultMap = MapUtil.newHashMap(); + + if (ObjectUtil.isNull(iterable)) { + return resultMap; + } + + for (T value : iterable) { + resultMap.computeIfAbsent(keyMapper.apply(value), k -> new ArrayList<>()).add(valueMapper.apply(value)); + } + + return resultMap; + } + + /** + * 将列表转成HashMap + * + * @param iterable 值列表 + * @param keyMapper Map的键映射 + * @param 键类型 + * @param 值类型 + * @return HashMap + */ + public static Map toMap(Iterable iterable, Function keyMapper) { + return toMap(iterable, keyMapper, v -> v); + } + + /** + * 将列表转成HashMap + * + * @param iterable 值列表 + * @param keyMapper Map的键映射 + * @param valueMapper Map的值映射 + * @param 列表值类型 + * @param 键类型 + * @param 值类型 + * @return HashMap + */ + public static Map toMap(Iterable iterable, Function keyMapper, Function valueMapper) { + final HashMap resultMap = MapUtil.newHashMap(); + + if (ObjectUtil.isNull(iterable)) { + return resultMap; + } + + for (T value : iterable) { + resultMap.put(keyMapper.apply(value), valueMapper.apply(value)); + } + + return resultMap; + } + /** * Iterator转List
* 不判断,直接生成新的List diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java index a516536bf..0ab5d784a 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/IterUtilTest.java @@ -3,8 +3,7 @@ package cn.hutool.core.collection; import org.junit.Assert; import org.junit.Test; -import java.util.ArrayList; -import java.util.Map; +import java.util.*; /** * {@link IterUtil} 单元测试 @@ -38,6 +37,31 @@ public class IterUtilTest { Assert.assertEquals("\"1\":\"2\":\"3\":\"4\"", join2); } + @Test + public void testToListMap() { + Map> expectedMap = new HashMap<>(); + expectedMap.put("a", Collections.singletonList("and")); + expectedMap.put("b", Arrays.asList("brave", "back")); + + Map> testMap = IterUtil.toListMap(Arrays.asList("and", "brave", "back"), + v -> v.substring(0, 1)); + Assert.assertEquals(testMap, expectedMap); + } + + @Test + public void testToMap() { + Map expectedMap = new HashMap<>(); + + Car bmw = new Car("123", "bmw"); + expectedMap.put("123", bmw); + + Car benz = new Car("456", "benz"); + expectedMap.put("456", benz); + + Map testMap = IterUtil.toMap(Arrays.asList(bmw, benz), Car::getCarNumber); + Assert.assertEquals(expectedMap, testMap); + } + public static class Car { private String carNumber; private String carName;