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

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

重复发生时,我会得到重复键exception。

是否有可能忽略添加值来映射重复发生时?

当有重复时,只需继续忽略该重复键。

这可以使用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是一个函数, mergeFunction与同一个键相关的两个值进行操作。 adress1对应于收集元素时遇到的第一个地址,而adress2对应于遇到的第二个地址:这个lambda只是告诉保留第一个地址而忽略第二个地址。

正如在JavaDocs中所说:

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

所以你应该使用toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)来代替。 只需提供合并function,即可确定需要在地图中放置哪一个副本。 例如,如果你不在乎哪一个,就打电话

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