首页 > 解决方案 > 在 Collectors.toMap() 函数中处理重复键

问题描述

我正在创建一个地图,其(键,值)将在我的 Person 对象中为(名称,地址):

Map<String, String> myMap = persons.stream.collect(Collector.toMap(person.getName(), person.getAddress(), (address1, address2) -> address1));

在重复键的情况下,我想跳过将第二个地址添加到地图中,并且还想记录名称。跳过重复的地址我已经可以使用mergeFunction,但是为了在这个mergeFunction中记录我需要的人对象的名称,例如:

(address1, address2) -> {
                           System.out.println("duplicate "+person.name() + " is found!");
                           return address1;
                        }

我通过将人员对象传递给此合并函数而陷入困境。

标签: javajava-8hashmapjava-stream

解决方案


我相信这种forEach方法Map.merge会更简单,也更适合当前的用例:

Map<String, String> 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父级),因此您可以轻松地将此处的合并功能与您现有的所需功能相关联。BinaryOperatortoMap


推荐阅读