mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
commit
0dde5ce4bc
@ -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
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user