首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >累加另一个列表中的列表计数

累加另一个列表中的列表计数
EN

Stack Overflow用户
提问于 2019-01-19 06:23:10
回答 3查看 151关注 0票数 8

目前我有如下代码。一个嵌入在另一个列表中的列表,我想要获取嵌入的列表对象的总数。

我想为此写一个快速的线条。在Java8中有没有有效的Lambda或FP技巧?

代码语言:javascript
代码运行次数:0
运行
复制
int totalNo = 0;
for (ClassB classB : listOfClassB) {
    totalNo+= classB.getAnotherObjList().size();
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-19 06:27:44

代码语言:javascript
代码运行次数:0
运行
复制
long totalSum = listOfClassB.stream()
     .mapToInt(elem -> elem.getAnotherObjList().size())
     .sum();

我认为sum的结果是一个long,因为几个整数可以超过最大int值;如果你确信它不会导致溢出,你总是可以强制转换它。

它不完全是一行程序,至少在上面的格式中是这样,但可以说它适合于一个表达式。

如果第一个列表中的大小写和元素为空,或者如果getAnotherObjList()返回空值,您可以通过过滤掉这些大小写来支持这一点:

代码语言:javascript
代码运行次数:0
运行
复制
long totalSum = listOfClassB.stream()
     .filter(Objects::nonNull)
     .map(ClassB::getAnotherObjList)
     .filter(Objects::nonNull)
     .mapToInt(List::size)
     .sum();
票数 9
EN

Stack Overflow用户

发布于 2019-01-19 10:56:51

您还可以尝试:

代码语言:javascript
代码运行次数:0
运行
复制
listOfClassB.stream().map(ClassB::getAnotherObjList).flatMap(List::stream).count();

这是非常简洁和优雅的。如果ClassB::getAnotherObjList不返回太多的项,那么性能不会成为问题。

票数 2
EN

Stack Overflow用户

发布于 2019-01-20 00:04:52

另一种方式,使用收集器:

代码语言:javascript
代码运行次数:0
运行
复制
int totalNo = listOfClassB.stream()
    .collect(Collectors.summingInt(classB -> classB.getAnotherObjList().size()));

一种等价的方式,仅使用方法引用:

代码语言:javascript
代码运行次数:0
运行
复制
int totalNo = listOfClassB.stream()
    .collect(Collectors.mapping(
             ClassB::getAnotherObjList, 
             Collectors.summingInt(List::size)));

或映射到流中,而不是在收集器中:

代码语言:javascript
代码运行次数:0
运行
复制
int totalNo = listOfClassB.stream()
    .map(ClassB::getAnotherObjList)
    .collect(Collectors.summingInt(List::size));
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54262192

复制
相关文章

相似问题

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