Stream-Collectors.toMap()Duplicate key问题

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));
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容