java收集器。使用相同的键映射(打印相同的键)
我有以下代码来获取地图:
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
)
);
如何使用重复密钥打印消息“重复密钥”
# 1 楼答案
使用当前代码,您将获得消息“Duplicate keys”,其中包含一个
MyObject
列表,其中至少包含两个MyObject
实例,这些实例的对象与getKey()
的值相等,例如Arrays.asList(new MyObject("foo", "bar"), new MyObject("foo", "bar2"))
到目前为止,不可能获得相应的键,您当前从merge函数中获得的实际上是使用同一键映射的2个值,这些值需要合并,以便为相应的键只保留一个值
您的问题是一个已知的问题,已在Java9中修复,请参见JDK-8040892。有关更多详细信息,相应的修复将允许我们从merge函数获取要合并的键和值
另见Why does Collectors.toMap report value instead of key on Duplicate Key error?
# 2 楼答案
正如在this answer中所解释的,这是一个已知的问题,将在Java 9中得到解决,至少对于不接受合并函数的
toMap
收集器来说是这样由于merge函数只接收要合并的两个值,并且签名不容易更改,因此这些重载方法目前还没有解决方案。不幸的是,没有},因此,除非在发布之前更改,否则将无法修复应返回
toMap
收集器在没有显式合并函数的情况下接受Map
{LinkedHashMap
的场景因此,解决方案是实现您自己的收集器。然后,您不必等待Java9,也不必冒着失望的风险
您可以将此收集器用作
或者使用限定的
MyCollector.toMap
,引用放置该自定义收集器的类