Java 8 Streams:计算进入终端操作的所有元素

Rol*_*and 18 java java-8 java-stream

我想知道是否有更好的(或只是其他)方法来获取进入流的终端操作而不是以下的所有项的计数:

Stream<T> stream = ... // given as parameter
AtomicLong count = new AtomicLong();
stream.filter(...).map(...)
      .peek(t -> count.incrementAndGet())
Run Code Online (Sandbox Code Playgroud)

其中count.get()给出了该阶段处理项目的实际数量.

我故意跳过了终端的操作,可能之间切换.forEach,.reduce.collect.我已经知道.count,但它似乎只有在我.forEach用a 交换a .map并使用.countas终端操作时才能正常工作.但在我看来好像.map被滥用了.

我不喜欢上面的解决方案:如果在它之后添加了一个过滤器,它只计算该特定阶段的元素,而不是那些进入终端操作的元素.

我想到的另一种方法是collect将过滤后的值映射到列表中并对其进行操作,然后调用list.size()以获取计数.然而,如果流的集合会导致错误,这将不起作用,而使用上述解决方案,我可以计算到目前为止所有已处理的项目,如果适当的话try/catch.然而,这并不是一项艰难的要求.

Eug*_*ene 7

在终端操作IMO之前,您似乎已经拥有了最干净的解决方案peek.我认为这是需要的唯一原因是出于调试目的 - 如果是这样的话,那就是peek为此而设计的.为此包装流并提供单独的实现是太多了 - 除了大量的时间和以后支持所添加的一切Streams.

对于添加了另一个过滤器的部分内容?好吧,提供代码注释(我们很多人这样做)和一些测试用例,否则会失败.


只是我0.02美元