gpt4 book ai didi

Java 8 流 : count all elements which enter the terminal operation

转载 作者:太空狗 更新时间:2023-10-29 22:41:27 25 4
gpt4 key购买 nike

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

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

count.get() 给出了该阶段已处理项目的实际计数。

我特意跳过了终端操作,因为它可能会在 .forEach.reduce.collect 之间发生变化。我知道.count已经,但它似乎只有在我将 .forEach.map 交换并使用 .count 作为终端操作时才能正常工作。但在我看来,.map 似乎被滥用了。

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

我想到的另一种方法是将过滤和映射的值收集到一个列表中并对其进行操作,然后调用 list.size() 来获得伯爵。但是,如果流的收集会导致错误,这将不起作用,而使用上述解决方案,如果适当的 try/catch 在中,我可以计算到目前为止所有已处理的项目地方。然而,这并不是一个硬性要求。

最佳答案

在终端操作 IMO 之前,您似乎已经通过peek 获得了最干净 解决方案。我认为需要这样做的唯一原因是出于调试目的——如果是这样的话,peek 就是为此而设计的。为此包装 Stream 并提供单独的实现方式太多了 - 除了大量的时间和后来对添加到 Streams 的所有内容的支持之外。

对于 如果添加另一个过滤器会怎样? 好吧,提供代码注释(我们很多人都这样做)和一些否则会失败的测试用例。


只是我的 0.02$

关于Java 8 流 : count all elements which enter the terminal operation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43653761/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com