美文网首页
Stream-Collectors.toMap()Duplica

Stream-Collectors.toMap()Duplica

作者: 李昂的数字之旅 | 来源:发表于2018-10-15 15:19 被阅读0次
Stream.of("a", "a").collect(Collectors.toMap(String::new, item -> item));

//结果:Exception in thread "main" java.lang.IllegalStateException: Duplicate key a

如果调map.put()方法应该会产生覆盖,不会出现重复key,查看源码发现是调用map.merge(key, value, mergeFunction)把元素放入map里,如果出现key重复会调用mergeFunction方法,Collectors提供了默认的callback方法,出现重复会直接报错。

private static <T> BinaryOperator<T> throwingMerger() {
    return (u,v) -> { throw new IllegalStateException(String.format("Duplicate key %s", u)); };
}

修改方案

自己传入mergeFunction,可以调用mergeFunction参数的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);
}

//修改后的方法
Stream.of("a", "a").collect(Collectors.toMap(item -> item item -> item, (oldVal, newVal) -> newVal));

相关文章

网友评论

      本文标题:Stream-Collectors.toMap()Duplica

      本文链接:https://www.haomeiwen.com/subject/uppfzftx.html