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

时间:2015-08-02 05:35:02

标签: java-8 java-stream

我正在控制消费者对此forEach的控制,因此可能会或可能不会要求他们执行某项操作。

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

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

1 个答案:

答案 0 :(得分:6)

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

使用Collector时出现类似问题。所有收集者都有finisher操作,但在许多情况下,它是x -> x之类的身份函数。在这种情况下,有时使用收集器的代码可以大大优化,但是您无法稳健地检测所提供的lambda是否为identity。为了解决这个问题,引入了另一个名为IDENTITY_FINISH的收集器特性。如果能够稳健地检测所提供的lambda是否是同一性函数,那么这个特性是不必要的。

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