使用java 8流在单次传递中计数多个项目
假设我有以下课程:
class Z {
X x;
Y y;
}
我有一个Z元素的列表。我想在一次传递中计算有多少元素在其x字段中有值x1,有多少元素在其y字段中有值y1
使用循环,它是直接向前的:
int countOfx1 = 0;
int countOfy1 = 0;
for (Z z: list) {
if (z.x == x1) {
countOfx1++
}
if (z.y == y1) {
countOfy1++
}
}
是否可以简单地使用流来实现
# 1 楼答案
您可以使用我在this answer中发布的
multiClassify
收集器:当然,简单的替代方法是遍历输入两次:
这样的解决方案很短,而且对于像
ArrayList
这样的常用输入,在性能方面通常不是很差# 2 楼答案
您可以通过为总计创建收集器来完成此操作:
与迭代解决方案相比,这有一个优势,即您可以使流并行,如果您的列表非常大,这可能会有性能优势