我正在控制消费者对此forEach的控制,因此可能会或可能不会要求他们执行某项操作。
list.parallelStream().forEach( x-> {} );
Streams懒惰Streams不会迭代,对吗?什么都不会发生是我所期待的。请告诉我,如果我错了。
答案 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
,则此时可以用空流替换流。再次有可能在运行时检测到提供的谓词总是为真,那么就没有必要创建这样的常量。