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

Merge pull request !123 from easepan/v5-dev
This commit is contained in:
Looly 2020-05-19 17:20:35 +08:00 committed by Gitee
commit 0dde5ce4bc
2 changed files with 104 additions and 2 deletions

View File

@ -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 <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>
* 不判断直接生成新的List

View File

@ -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<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 {
private String carNumber;
private String carName;