gpt4 book ai didi

java-8 - 将一个 Java 8 Stream.forEach( x -> {} );做任何事情?

转载 作者:行者123 更新时间:2023-12-03 20:34:53 25 4
gpt4 key购买 nike

我正在控制到达此 forEach 的消费者,因此可能会或可能不会要求它执行操作。

list.parallelStream().forEach( x-> {} );

Streams 是惰性的 Streams 不会迭代,对吧?什么都不会发生是我所期望的。如果我错了,请告诉我。

最佳答案

它将遍历整个流,将任务提交到 fork-join 池,将列表拆分为多个部分并将所有列表元素传递给这个空的 lambda。目前无法在运行时检查 lambda 表达式是否为空,因此无法对其进行优化。

使用 Collector 时出现类似问题。所有收集器都有 finisher 操作,但在很多情况下它是一个身份函数,如 x -> x 。在这种情况下,有时可以大大优化使用收集器的代码,但您无法可靠地检测提供的 lambda 是否为身份。为了解决这个问题,引入了一个名为 IDENTITY_FINISH 的额外收集器特性。如果可以稳健地检测提供的 lambda 是否是恒等函数,则不需要此特性。

另请参阅 JDK-8067971 讨论。这建议创建像 Predicate.TRUE (始终为真)或 Predicate.FALSE (始终为假)这样的静态常量来优化像 Stream.filter 这样的操作。例如,如果提供了 Predicate.TRUE,则可以去除过滤步骤,如果提供了 Predicate.FALSE,那么此时可以将流替换为空流。如果在运行时检测到提供的谓词始终为真,那么就没有必要创建这样的常量。

关于java-8 - 将一个 Java 8 Stream.forEach( x -> {} );做任何事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31768891/

25 4 0