Java8利用stream()将list转map时切记处理key冲突

532 阅读1分钟

list转map的坑

在通过stream()将list转为map时一般最常见的写法都是

List<Integer> list = new ArrayList<>();
Map<Integer,String> map = list.stream()
                              .collect(Collectors.toMap(i -> i, String::valueOf);

乍一眼看上去没什么问题,可是忽略了一个重点,List本身的数据结构是允许重复的,而Map里key是不可重复的,所以如果假如list里包含了重复元素,在通过Stream()的方式转为Map的时候,会出现 Duplicate Key 的IllegalException导致程序出错。

Collectos.toMap重载了一个三个入参的方法

public static <T, K, U>
Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                Function<? super T, ? extends U> valueMapper,
                                BinaryOperator<U> mergeFunction) {
    return toMap(keyMapper, valueMapper, mergeFunction, HashMap::new);
}

第三个参数 mergeFunction 即当key冲突时的解决函数,例如可以传入函数式 (v1,v2) -> v2 ,冲突时新值覆盖旧值

List<Integer> list = new ArrayList<>();
Map<Integer,String> map = list.stream()
                              .collect(Collectors.toMap(
                                  i -> i, 
                                  String::valueOf,
                                  (v1, v2) -> v2
                              ));