在使用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));