在使用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)
),则在执行收集操作时将抛出IllegalStateException
exception。 如果映射键可能有重复,请使用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));