gpt4 book ai didi

java - 在一个 lambda 表达式中收集复杂对象

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:44:55 25 4
gpt4 key购买 nike

我有一个对象列表。首先,我需要按类型对其进行排序。比按面值。最后,汇总所有数量:

      class Coin{
String type;
BigInteger faceValue;
BigInteger quantity;
...
}

List<Coin> coins = new ArrayList<>();
coins.add(new Coin("USD", 1, 150));
coins.add(new Coin("USD", 1, 6));
coins.add(new Coin("USD", 1, 60));
coins.add(new Coin("USD", 2, 100));
coins.add(new Coin("USD", 2, 100));
coins.add(new Coin("CAD", 1, 111));
coins.add(new Coin("CAD", 1, 222));

结果列表必须只包含 3 个新硬币对象:

Coin("USD", 1 , 216)
Coin("USD", 2 , 200)
Coin("CAD", 1 , 333)

这怎么能只写在一个 lambda 表达式中呢?

最佳答案

您可以使用 Collectors.toMap 解决这个问题:

public List<Coin> groupedCoins(List<Coin> coins) {
return new ArrayList<>(
coins.stream()
.collect(Collectors.toMap(
coin -> Arrays.asList(coin.getType(), coin.getFaceValue()), Function.identity(),
(coin1, coin2) -> {
BigInteger netQ = coin1.getQuantity().add(coin2.getQuantity());
return new 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,
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());
}

关于java - 在一个 lambda 表达式中收集复杂对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56007336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com