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

lrn*_*grm 4 java-8 java-stream

我控制的消费者得到了这个forEach所以它可能会或可能不会被要求执行一个动作.

list.parallelStream().forEach( x-> {} );
Run Code Online (Sandbox Code Playgroud)

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

Tag*_*eev 6

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

使用中出现类似问题Collector.所有收藏家都有这个finisher操作,但在很多情况下它都是一个身份功能x -> x.在这种情况下,有时使用收集器的代码可以大大优化,但是您无法稳健地检测所提供的lambda是否为identity.为了解决这个问题IDENTITY_FINISH,引入了额外的收集器特性.如果能够鲁棒地检测所提供的λ是否是同一性函数,则该特性是不必要的.

另请参阅JDK-8067971讨论.这建议创建静态常量,如Predicate.TRUE(总是为真)或Predicate.FALSE(总是为假)来优化像这样的操作Stream.filter.例如,如果Predicate.TRUE被提供,然后过滤步骤可以删除,并且如果Predicate.FALSE被提供,则流可以被用在这一点空流代替.再次有可能在运行时检测到提供的谓词总是为真,那么就没有必要创建这样的常量.

  • 一旦所有内联内联到单个循环中,编译器可能能够为*sequential*流优化一些内容,但对于并行流,跨线程任务队列对JIT基本上是不透明的.流管道必须对lambda执行某种内省以执行此类优化. (3认同)