Pat*_*tan 226 java java-8 java-stream
Map<String, String> phoneBook=people.stream()
.collect(toMap(Person::getName, Person::getAddress));
Run Code Online (Sandbox Code Playgroud)
重复发生时,我得到重复的密钥异常.
是否可以忽略在重复发生时将值添加到映射?
当存在重复时,它应该继续忽略该重复键.
Tun*_*aki 396
这可以使用以下mergeFunction参数Collectors.toMap(keyMapper, valueMapper, mergeFunction):
Map<String, String> phoneBook =
people.stream()
.collect(Collectors.toMap(
Person::getName,
Person::getAddress,
(address1, address2) -> {
System.out.println("duplicate key found!");
return address1;
}
));
Run Code Online (Sandbox Code Playgroud)
mergeFunction是一个函数,它对与同一个键相关的两个值进行操作.adress1对应于收集元素时遇到的第一个地址,adress2对应于遇到的第二个地址:这个lambda告诉保留第一个地址并忽略第二个地址.
ala*_*ter 85
如JavaDocs所述:
如果映射的键包含重复项(根据
Object.equals(Object)),IllegalStateException则在执行收集操作时抛出a.如果映射的键可能有重复,请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));
Run Code Online (Sandbox Code Playgroud)
@alaster答案对我有很大帮助,但是如果有人试图对信息进行分组,我想添加一些有意义的信息。
例如,如果您有两个产品Orders相同code但不同quantity的产品,并且您希望将数量相加,则可以执行以下操作:
List<Order> listQuantidade = new ArrayList<>();
listOrders.add(new Order("COD_1", 1L));
listOrders.add(new Order("COD_1", 5L));
listOrders.add(new Order("COD_1", 3L));
listOrders.add(new Order("COD_2", 3L));
listOrders.add(new Order("COD_3", 4L));
listOrders.collect(Collectors.toMap(Order::getCode, o -> o.getQuantity(), (o1, o2) -> o1 + o2));
Run Code Online (Sandbox Code Playgroud)
结果:
{COD_3=4, COD_2=3, COD_1=9}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
99441 次 |
| 最近记录: |