使用Java流计算包含在其他集合中的集合中包含的字段的总和

使用Java流计算包含在其他集合中的集合中包含的字段的总和,java,java-stream,Java,Java Stream,我想使用java stream()计算包含在另一个集合中的集合中的字段的总和。 只有当计算字段直接位于第一个集合中时,我才知道如何执行此操作,如下所示: return collectionOfObjectA.stream() .mapToDouble(c1 -> c1.getSalary()).sum(); 但是现在“collectionOfObjectA”包含另一个“collectionOfObjectB”,最后一个是包含“salary”字段的 反对意见a:

我想使用java stream()计算包含在另一个集合中的集合中的字段的总和。 只有当计算字段直接位于第一个集合中时,我才知道如何执行此操作,如下所示:

return collectionOfObjectA.stream() 
             .mapToDouble(c1 -> c1.getSalary()).sum();
但是现在“collectionOfObjectA”包含另一个“collectionOfObjectB”,最后一个是包含“salary”字段的

反对意见a:

{
 id:1,
Collection<ObjectB>
}
我现在的计算方法如下:

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

        return result;

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();
当然,您可以直接使用
flatMapToDouble
,如@Naman所述:

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

collection1()
是一个方法还是一个变量?你能告诉我们
collection1
collection2
的类型吗?抱歉,刚刚编辑了这个问题,很可能这是正确的答案。但是OP没有说明的是
collection2
的类型,可能不是
List
。更一般地说,我推荐
e->e.stream()
@KunLun或者
.flatMap(Collection::stream)
谢谢,但它不起作用;“薪资”字段处于objectB@MedMahmoud您的问题有点不清楚,我根据您的编辑器编辑我的答案,只需使用
flatMapToDouble
return collection1.stream()
        .flatMapToDouble(
                cA -> cA.getCollectionB().stream().mapToDouble(ObjectB::getSalary)
        ).sum();