我有一个对象列表。首先,我需要按类型对其进行排序。
比faceValue。最后,总结所有数量:
class Coin {
String type;
BigInteger faceValue;
BigInteger数量;
...
}
列表 Coin coins = new ArrayList ();
coins.add(新币(\"USD\",1,150));
coins.add(新币(\"USD\",1,6));
coins.add(新币(\"USD\",1,60));
coins.add(新币(\"USD\",2,100));
coins.add(新币(\"USD\",2,100));
coins.add(新币(\"CAD\",1,111));
coins.add(新币(\"CAD\",1,222));
结果列表必须只包含3个新的硬币对象:
硬币(\"USD\",1,216)
硬币(\"USD\",2,200)
硬币(\"CAD\",1,333) )
如何仅在一个lambda表达式中编写?
您可以使用 Collectors.toMap 解决这个问题:
public List Coin groupsCoins(List Coin coins){
返回新的ArrayList (
coins.stream()
.collect(Collectors.toMap(
coin - Arrays。 asList(coin.getType(),coin.getFaceValue()),Function.identity(),
(coin1,coin2) - {
BigInteger netQ = coin1.getQuantity()。add(coin2 .getQuantity());
返回新的Coin(coin1.getType(),coin1.getFaceValue(),netQ);
}))
.values());
}
或更复杂的一个班轮分组和总和:
public List Coin groupedAndSummedCoins(List Coin coins){
return coins.stream()
.collect(Collectors.groupingBy(Coin :: getType,
Collectors.groupingBy(Coin :: getFaceValue,$ b) $ b Collectors.reducing(BigInteger.ZERO,Coin :: getQuantity,BigInteger :: add))))
.entrySet()
.stream()
.flatMap(e - e.getValue()。entrySet()。stream()
.map(a - new Coin(e.getKey(),a.getKey(),a.getValue())))
.collect(Collectors.toList());
}
本文地址:IT屋 在一个lambda表达式中收集复杂对象