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