Browse Source

!123 添加List转Map的工具方法

Merge pull request !123 from easepan/v5-dev
Looly 5 years ago
parent
commit
0dde5ce4bc

+ 78 - 0
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.lang.func.Func1;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.ArrayUtil;
+import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.ReflectUtil;
 import cn.hutool.core.util.StrUtil;
 import cn.hutool.core.util.StrUtil;
 
 
@@ -16,6 +17,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Map.Entry;
+import java.util.function.Function;
 
 
 /**
 /**
  * {@link Iterable} 和 {@link Iterator} 相关工具类
  * {@link Iterable} 和 {@link Iterator} 相关工具类
@@ -458,6 +460,82 @@ public class IterUtil {
 	}
 	}
 
 
 	/**
 	/**
+	 * 将列表转成值为List的HashMap
+	 *
+	 * @param iterable  值列表
+	 * @param keyMapper Map的键映射
+	 * @param <K>       键类型
+	 * @param <V>       值类型
+	 * @return HashMap
+	 */
+	public static <K, V> Map<K, List<V>> toListMap(Iterable<V> iterable, Function<V, K> keyMapper) {
+		return toListMap(iterable, keyMapper, v -> v);
+	}
+
+	/**
+	 * 将列表转成值为List的HashMap
+	 *
+	 * @param iterable    值列表
+	 * @param keyMapper   Map的键映射
+	 * @param valueMapper Map中List的值映射
+	 * @param <T>         列表值类型
+	 * @param <K>         键类型
+	 * @param <V>         值类型
+	 * @return HashMap
+	 */
+	public static <T, K, V> Map<K, List<V>> toListMap(Iterable<T> iterable, Function<T, K> keyMapper, Function<T, V> valueMapper) {
+		final HashMap<K, List<V>> 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 <K>       键类型
+	 * @param <V>       值类型
+	 * @return HashMap
+	 */
+	public static <K, V> Map<K, V> toMap(Iterable<V> iterable, Function<V, K> keyMapper) {
+		return toMap(iterable, keyMapper, v -> v);
+	}
+
+	/**
+	 * 将列表转成HashMap
+	 *
+	 * @param iterable    值列表
+	 * @param keyMapper   Map的键映射
+	 * @param valueMapper Map的值映射
+	 * @param <T>         列表值类型
+	 * @param <K>         键类型
+	 * @param <V>         值类型
+	 * @return HashMap
+	 */
+	public static <T, K, V> Map<K, V> toMap(Iterable<T> iterable, Function<T, K> keyMapper, Function<T, V> valueMapper) {
+		final HashMap<K, V> 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<br>
 	 * Iterator转List<br>
 	 * 不判断,直接生成新的List
 	 * 不判断,直接生成新的List
 	 *
 	 *

+ 26 - 2
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.Assert;
 import org.junit.Test;
 import org.junit.Test;
 
 
-import java.util.ArrayList;
-import java.util.Map;
+import java.util.*;
 
 
 /**
 /**
  * {@link IterUtil} 单元测试
  * {@link IterUtil} 单元测试
@@ -38,6 +37,31 @@ public class IterUtilTest {
 		Assert.assertEquals("\"1\":\"2\":\"3\":\"4\"", join2);
 		Assert.assertEquals("\"1\":\"2\":\"3\":\"4\"", join2);
 	}
 	}
 
 
+	@Test
+	public void testToListMap() {
+		Map<String, List<String>> expectedMap = new HashMap<>();
+		expectedMap.put("a", Collections.singletonList("and"));
+		expectedMap.put("b", Arrays.asList("brave", "back"));
+
+		Map<String, List<String>> testMap = IterUtil.toListMap(Arrays.asList("and", "brave", "back"),
+				v -> v.substring(0, 1));
+		Assert.assertEquals(testMap, expectedMap);
+	}
+
+	@Test
+	public void testToMap() {
+		Map<String, Car> expectedMap = new HashMap<>();
+
+		Car bmw = new Car("123", "bmw");
+		expectedMap.put("123", bmw);
+
+		Car benz = new Car("456", "benz");
+		expectedMap.put("456", benz);
+
+		Map<String, Car> testMap = IterUtil.toMap(Arrays.asList(bmw, benz), Car::getCarNumber);
+		Assert.assertEquals(expectedMap, testMap);
+	}
+
 	public static class Car {
 	public static class Car {
 		private String carNumber;
 		private String carNumber;
 		private String carName;
 		private String carName;