java - GroupingBy 和 List 作为结果

标签 java java-8 java-stream collectors groupingby

我们有以下内容:

public List<Balance> mapToBalancesWithSumAmounts(List<MonthlyBalancedBooking> entries) {
    return entries
      .stream()
      .collect(
        groupingBy(
          MonthlyBalancedBooking::getValidFor,
          summingDouble(MonthlyBalancedBooking::getAmount)
        )
      )
      .entrySet()
      .stream()
      .map(localDateDoubleEntry -> new Balance(localDateDoubleEntry.getValue(), localDateDoubleEntry.getKey()))
      .collect(toList());
  }

是否有可能避免代码中的第二个stream()路径,因此在我们的例子中groupingBy()的结果应该是一个列表。我们需要将map()函数传递给collect或groupingBy,这在Java 8中可能吗?

最佳答案

这是不可能的,因为您在映射到 Balance 对象时查找的值只能在 MonthlyBalancedBooking 列表的所有条目都被评估后才能计算进行迭代。

new Balance(localDateDoubleEntry.getValue(), localDateDoubleEntry.getKey())

在单个终端操作中移动流的另一种方法可以是使用 collectingAndThen 作为:

public List<Balance> mapToBalancesWithSumAmounts(List<MonthlyBalancedBooking> entries) {
    return entries.stream()
            .collect(Collectors.collectingAndThen(
                    Collectors.groupingBy(MonthlyBalancedBooking::getValidFor,
                            Collectors.summingDouble(MonthlyBalancedBooking::getAmount)),
                    map -> map.entrySet().stream()
                            .map(entry -> new Balance(entry.getValue(), entry.getKey()))))
            .collect(Collectors.toList());
}

关于java - GroupingBy 和 List 作为结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60862618/

相关文章:

java - 捕获cxf在camel上下文中抛出的异常

java - 使用 lambda 表达式转换 List

java-8 - 如何使用 Java 8 探索所有子目录?

java - 如何使用流来获得相互威胁的棋王对?

Java 8 - 如何声明对返回 void 的未绑定(bind)非静态方法的方法引用

在1.5上编译的java代码可以运行1.4环境

java - 以编程方式定义 Spring DataSource 导致 ClassNotFoundException

java - 如何在gae中下载文件

Java 8 并行流查找优先

java - findAny orElse 过滤后