Map<String, String> phoneBook=people.stream()
.collect(toMap(Person::getName, Person::getAddress));
重複發生時,我得到重複密鑰異常。當使用流生成地圖時忽略重複項
重複發生時,是否可以忽略添加映射的值?
當有重複時,只需繼續忽略該重複密鑰。
Map<String, String> phoneBook=people.stream()
.collect(toMap(Person::getName, Person::getAddress));
重複發生時,我得到重複密鑰異常。當使用流生成地圖時忽略重複項
重複發生時,是否可以忽略添加映射的值?
當有重複時,只需繼續忽略該重複密鑰。
這是可能的使用的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
是,在使用相同的密鑰相關聯的兩個值進行操作的功能。 adress1
對應於收集元素時遇到的第一個地址,並且adress2
對應於遇到的第二個地址:此lambda只是告訴保留第一個地址並忽略第二個地址。
如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, (p1, p2) -> p1));
只需提供[合併功能](https://docs.oracle.com/javase/8/docs/api/java/util/ stream/Collectors.html#toMap-java.util.function.Function-java.util.function.Function-java.util.function.BinaryOperator-)表示'(舊的,新的) - >舊的'。 –
如果你可以使用它,HashSet會忽略該鍵,如果它已經存在。 – sahitya
@隊長aryabhatta。有沒有可能在hashset – Patan