目前我有如下代码。一个嵌入在另一个列表中的列表,我想要获取嵌入的列表对象的总数。
我想为此写一个快速的线条。在Java8中有没有有效的Lambda或FP技巧?
int totalNo = 0;
for (ClassB classB : listOfClassB) {
totalNo+= classB.getAnotherObjList().size();
}
发布于 2019-01-18 22:27:44
long totalSum = listOfClassB.stream()
.mapToInt(elem -> elem.getAnotherObjList().size())
.sum();
我认为sum的结果是一个long
,因为几个整数可以超过最大int值;如果你确信它不会导致溢出,你总是可以强制转换它。
它不完全是一行程序,至少在上面的格式中是这样,但可以说它适合于一个表达式。
如果第一个列表中的大小写和元素为空,或者如果getAnotherObjList()返回空值,您可以通过过滤掉这些大小写来支持这一点:
long totalSum = listOfClassB.stream()
.filter(Objects::nonNull)
.map(ClassB::getAnotherObjList)
.filter(Objects::nonNull)
.mapToInt(List::size)
.sum();
发布于 2019-01-19 02:56:51
您还可以尝试:
listOfClassB.stream().map(ClassB::getAnotherObjList).flatMap(List::stream).count();
这是非常简洁和优雅的。如果ClassB::getAnotherObjList
不返回太多的项,那么性能不会成为问题。
发布于 2019-01-19 16:04:52
另一种方式,使用收集器:
int totalNo = listOfClassB.stream()
.collect(Collectors.summingInt(classB -> classB.getAnotherObjList().size()));
一种等价的方式,仅使用方法引用:
int totalNo = listOfClassB.stream()
.collect(Collectors.mapping(
ClassB::getAnotherObjList,
Collectors.summingInt(List::size)));
或映射到流中,而不是在收集器中:
int totalNo = listOfClassB.stream()
.map(ClassB::getAnotherObjList)
.collect(Collectors.summingInt(List::size));
https://stackoverflow.com/questions/54262192
复制相似问题