gpt4 book ai didi

java - Collectors.toMap 具有相同的键(打印相同的键)

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:45:26 25 4
gpt4 key购买 nike

我有这个代码来获取 map :

List<MyObject> myList = myMethod.getList();
myList.stream().collect(
Collectors.toMap(
MyObject::getKey,
MyObject::getValue,
(e1, e2) -> {
System.out.println("Duplicate keys !!!");
return e1;
},
LinkedHashMap::new
)
);

如何使用重复 key 打印消息“重复 key ”?

最佳答案

this answer 中所述,这是一个将在 Java 9 中修复的已知问题——至少对于不接受合并函数的 toMap 收集器是这样。

由于合并函数只接收要合并的两个值并且签名不能轻易更改,因此目前还没有针对这些重载方法的修复方法。不幸的是,没有 toMap 收集器接受没有显式合并功能的 Map Supplier,所以除非这在发布前有所改变,否则会有对于应返回 LinkedHashMap 的情况,无法解决。

所以解决方案是实现自己的收集器。然后,您不必等待 Java 9,也不必冒险失望。

static <T, K, V, M extends Map<K, V>> Collector<T, ?, M> toMap(
Function<T, K> keyExtractor, Function<T, V> valueExtractor, Supplier<M> mapSupplier) {
return Collector.of(mapSupplier,
(m, t) -> putUnique(m, keyExtractor.apply(t), valueExtractor.apply(t)),
(m1,m2)-> { m2.forEach((k, v) -> putUnique(m1, k, v)); return m1; }
);
}
private static <K,V> void putUnique(Map<K,V> map, K key, V v1){
V v2 = map.putIfAbsent(key, v1);
if(v2 != null) throw new IllegalStateException(
String.format("Duplicate key %s (values %s and %s)", key, v1, v2));
}

您可以将此收集器用作

LinkedHashMap<KeyType, ValueType> map = myList.stream()
.collect(toMap(MyObject::getKey, MyObject::getValue, LinkedHashMap::new));

或者使用限定的 MyCollector.toMap,引用您放置自定义收集器的类。

关于java - Collectors.toMap 具有相同的键(打印相同的键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40761954/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com