我想知道除了以下方式之外,是否有更好的(或者其他)方法来获取流终止操作中所有项目的计数:
Stream<T> stream = ... // given as parameter
AtomicLong count = new AtomicLong();
stream.filter(...).map(...)
.peek(t -> count.incrementAndGet())
在那个阶段,count.get()
给出了处理过的项目的实际计数。
我故意跳过了终端操作,因为它可能在 .forEach
, .reduce
或 .collect
之间变化。我确实知道.count
,但似乎只有在我用 .map
替换 .forEach
并将 .count
作为终端操作时才有效。但我觉得这样使用 .map
是错误的。
我不太喜欢上面的解决方案的原因是:如果在它之后添加一个过滤器,它只会计算特定阶段的元素数量,而不是进入终端操作的元素数量。
我想到的另一种方法是将过滤和映射后的值收集到列表中,并在该列表上进行操作,然后只需调用 list.size()
即可获得计数。但是,如果流的收集导致错误,这种方法将无法工作,而上面的解决方案可以在适当的 try/catch
放置的情况下对迄今处理过的所有项目进行计数。不过这不是硬性要求。