为了讨论起见,让我重新格式化您的示例:
long runCount = 0L;
myStream.stream()
.filter(...)
.forEach(item -> {
foo();
bar();
runCount++;
});
System.out.println("The lambda ran " + runCount + " times");
如果您确实需要在Lambda中递增计数器,则通常的做法是将计数器设为AtomicInteger
或AtomicLong
,然后在其上调用递增方法之一。
您可以使用单元素int
或long
数组,但是如果流并行运行,则将具有竞争条件。
但是请注意,流以结尾forEach
,这意味着没有返回值。您可以将更forEach
改为peek
,使项目通过,然后对它们进行计数:
long runCount = myStream.stream()
.filter(...)
.peek(item -> {
foo();
bar();
})
.count();
System.out.println("The lambda ran " + runCount + " times");
这好一些,但仍然有些奇怪。原因是forEach
并且peek
只能通过副作用来完成他们的工作。Java 8的新兴功能风格是避免副作用。通过将计数器的增量提取到count
流中的操作中,我们做了一些工作。其他典型的副作用是将项目添加到集合中。通常这些可以通过使用收集器来替换。但是,在不知道您要实际执行什么工作的情况下,我无法提出更具体的建议。