首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >结果为List的GroupingBy

结果为List的GroupingBy
EN

Stack Overflow用户
提问于 2020-03-26 15:29:13
回答 2查看 126关注 0票数 2

我们有以下内容:

代码语言:javascript
复制
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()-function或groupingBy的可能性,在Java8中这是可能的吗?

EN

回答 2

Stack Overflow用户

发布于 2020-03-26 15:32:06

简单的方法是使用具有合并功能的toMap()收集器,如下所示:

代码语言:javascript
复制
List<Balance> balances = new ArrayList<>(entries.stream()
       .collect(toMap(MonthlyBalancedBooking::getValidFor, m -> new Balance(m.getAmount(),
                                              m.getValidFor()),Balance::merge)).values());

我假设对于Balance类有以下属性:

代码语言:javascript
复制
class Balance {
   private Double value;
   private Integer key;

   public Balance merge(Balance b) {
     this.value += b.getValue();
     return this;
   }
}
票数 2
EN

Stack Overflow用户

发布于 2020-03-26 16:27:07

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

代码语言:javascript
复制
new Balance(localDateDoubleEntry.getValue(), localDateDoubleEntry.getKey())

不过,在单个终端操作中移动流的另一种方法是使用collectingAndThen

代码语言:javascript
复制
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());
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60862618

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档