Map<String, String> phoneBook = people.stream()
.collect(toMap(Person::getName,
Person::getAddress));
我得到java.lang.IllegalStateException:当找到一个重复的元素时,重复键。
是否有可能忽略这种例外添加值到地图?
当有重复的键时,应该忽略重复的键继续执行。
感觉toMap经常工作,但并不总是java流的一个黑暗的弱点。好像他们应该把它叫做“ouniquemap”之类的…
最简单的方法是使用收集器。groupingBy而不是collections . tomap。
默认情况下它会返回一个List类型的输出,但是碰撞问题已经解决了,这也许是你想要的存在的倍数。
Map<String, List<Person>> phoneBook = people.stream()
.collect(groupingBy((x) -> x.name));
如果一个Set类型的地址集合与特定的名称相关联,groupingBy也可以做到这一点:
Map<String, Set<String>> phoneBook = people.stream()
.collect(groupingBy((x) -> x.name, mapping((x) -> x.address, toSet())));
另一种方法是“开始”一个哈希或一个集…并仔细跟踪以确保键在输出流中不会重复。啊。这里有一个例子,碰巧在这种情况下幸存下来…
正如在JavaDocs中所说:
如果映射的键包含重复项(根据
Object.equals(Object))时,当异常时抛出IllegalStateException
执行收集操作。如果映射的键可能有
重复,使用toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)代替。
所以你应该使用toMap(Function keyMapper, Function valueMapper, BinaryOperator mergeFunction)来代替。只需提供一个合并函数,它将确定将哪个副本放入映射中。
例如,如果你不关心是哪个,打电话就可以了
Map<String, String> phoneBook = people.stream().collect(
Collectors.toMap(Person::getName, Person::getAddress, (a1, a2) -> a1));