作者:暮年排击_967 | 来源:互联网 | 2022-11-21 19:21
我正在创建一个地图,其(键,值)将在我的Person对象中(名称,地址):
Map myMap = persons.stream.collect(Collector.toMap(person.getName(), person.getAddress(), (address1, address2) -> address1));
在重复键情况下,我想跳过将第二个地址添加到地图中,并希望也记录该名称.跳过重复的地址我已经可以使用mergeFunction,但是在oder中记录我在这个mergeFunction中需要的名称person对象,如:
(address1, address2) -> {
System.out.println("duplicate "+person.name() + " is found!");
return address1;
}
我通过将person对象传递给此合并函数而陷入困境.有人能给我一些提示吗?先谢谢你!
1> 小智..:
@Aomine:解决方案看起来不错,也适合我.只是想确认一下这个迭代两次吧?由于下面的简单解决方案,它只迭代一次,但实现了所需要的.
Map myMap= new HashMap<>();
persons.stream().foreach(item-> {
if(myMap.containsKey(item.getName()))
{/*do something*/}
else
myMap.put(item.getName(),item.getAddress());
});
2> Naman..:
我相信这种forEach
方法Map.merge
对于当前的用例来说会更简单和合适:
Map myMap = new HashMap<>();
persons.forEach(person -> myMap.merge(person.getName(), person.getAddress(), (adrs1, adrs2) -> {
System.out.println("duplicate " + person.getName() + " is found!");
return adrs1;
}));
注:Map.merge
也使用BiFunction
(母公司BinaryOperator
为使用toMap
),因此,你可以在这里轻松地将相关功能合并到现有所需的功能.