【问题标题】:Calculate the sum of a field contained in a collection that is contained in an other collection using Java Stream使用 Java Stream 计算包含在另一个集合中的集合中包含的字段的总和
【发布时间】:2021-01-15 10:37:43
【问题描述】:

我想使用 java stream() 计算包含在另一个集合中的集合中包含的字段的总和。 如果计算字段直接在第一个集合中,我只知道该怎么做,像这样:

return collectionOfObjectA.stream() 
             .mapToDouble(c1 -> c1.getSalary()).sum();

但是现在“collectionOfObjectA”包含另一个“collectionOfObjectB”,而最后一个是包含“salary”字段的那个。

对象A:

{
 id:1,
Collection<ObjectB>
}

和对象B:

{
 id:1,
 salary: 4000
}

我现在的计算方式如下:

     Double result=0.0;
        for (ObjectA obj: collectionOfObjectA())
        {
            for(ObjectB objB : objA.getcollectionOfObjectB()){
                result+= objB.getSalary();
            }
        }

        return result;

【问题讨论】:

  • collection1() 是方法还是变量?
  • 你能告诉我们collection1collection2的类型吗?
  • 抱歉刚刚编辑了问题

标签: java java-stream


【解决方案1】:

mapToDouble 之前,您必须像这样使用flatMap

return collection1.stream()
        .flatMap(cA -> cA.getCollectionB().stream())
        .mapToDouble(ObjectB::getSalary)
        .sum();

或者你可以在flatMap之前使用map

return collection1.stream()
        .map(ObjectA::getCollectionB)
        .flatMap(List::stream)
        .mapToDouble(ObjectB::getSalary)
        .sum();

你可以像@Naman 提到的那样直接使用flatMapToDouble

return collection1.stream()
        .flatMapToDouble(
                cA -> cA.getCollectionB().stream().mapToDouble(ObjectB::getSalary)
        ).sum();

【讨论】:

  • 很可能这是正确的答案。但是 OP 没有说的是collection2 的类型,也许不是List。为了更通用,我会推荐e -&gt; e.stream()
  • @KunLun 或者.flatMap(Collection::stream)
  • 谢谢,但没用;工资字段在 objectB 中
  • @MedMahmoud 你的问题有点不清楚,我根据你的编辑编辑我的答案
  • 或者直接使用flatMapToDouble
猜你喜欢
  • 2014-12-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-26
  • 2012-01-22
  • 1970-01-01
  • 2011-12-18
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多