使用流生成地图时忽略重复项

2022-08-31 04:49:52
Map<String, String> phoneBook = people.stream()
                                      .collect(toMap(Person::getName,
                                                     Person::getAddress));

我得到一个重复的元素,当找到一个重复的元素。java.lang.IllegalStateException: Duplicate key

是否可以在向映射添加值时忽略此类异常?

当存在重复项时,只需忽略该重复键即可继续。


答案 1

使用 Collectors.toMap(keyMapper, valueMapper, mergeFunction) 的参数可以做到这一点mergeFunction

Map<String, String> phoneBook = 
    people.stream()
          .collect(Collectors.toMap(
             Person::getName,
             Person::getAddress,
             (address1, address2) -> {
                 System.out.println("duplicate key found!");
                 return address1;
             }
          ));

mergeFunction是对与同一键关联的两个值进行操作的函数。 对应于收集元素时遇到的第一个地址,对应于遇到的第二个地址:此 lambda 只是告诉保留第一个地址并忽略第二个地址。adress1adress2


答案 2

正如JavaDocs中所说:

如果映射的键包含重复项(根据 ),则在执行收集操作时将引发 a。如果映射的键可能有重复项,请改用。Object.equals(Object)IllegalStateExceptiontoMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)

所以你应该使用toMap(Function keyMapper,Function valueMapper,BinaryOper mergeFunction)来代替。只需提供一个合并函数,该函数将确定将哪一个重复项放入地图中。

例如,如果您不在乎哪一个,只需致电

Map<String, String> phoneBook = 
        people.stream()
              .collect(Collectors.toMap(Person::getName, 
                                        Person::getAddress, 
                                        (a1, a2) -> a1));

推荐