当前位置: 首页 > 面试题库 >

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

苏淇
2023-03-14
问题内容

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

      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.toMapas 解决:

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());
}


 类似资料:
  • 我在写一个方法,它将返回一个区域数据列表,我在做以下方式,但得到错误 我正在犯错误 在线regionData=CountriesSo.Stream().Map(C->I18NFacade.GetRegionsForCountryIso(c)).Collect(Collectors.ToList()); 函数i18nfacade.getRegionsForCountryIso(c)返回了一个区域数据

  • 我想更新一个条目,如下所示: 此代码向我提供了以下错误消息: lambda表达式中使用的变量应该是最终的或有效的最终的 我该如何解决这个问题?

  • 如何在lambda表达式中将对象设置为另一个?我犯了错误

  • 本文向大家介绍Java8新特性Lambda表达式的一些复杂用法总结,包括了Java8新特性Lambda表达式的一些复杂用法总结的使用技巧和注意事项,需要的朋友参考一下 简介 lambda表达式是JAVA8中提供的一种新的特性,它支持Java也能进行简单的“函数式编程”。 它是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstractio

  • 我有以下在MongoDB中运行良好的MongoDB聚合查询 如何使用Spring Data MongoDB API来表示这个复杂的$sum操作? sum()方法只需要简单字符串。根据这张票(已关闭)https://jira.spring.io/browse/DATAMONGO-784聚合应支持复杂的操作,如$cmp和$cond 更新:这里似乎忘记了该方法的sum(AggregationExpres