Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Will a Java 8 Stream.forEach( x -> {} ); do anything?

I am controlling the Consumer that get's to this forEach so it may or may not be asked to perform an action.

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

Streams being lazy Streams won't iterate, right? Nothing will happen is what i expect. Tell me if i am wrong, please.

like image 397
corlaez Avatar asked Mar 16 '23 05:03

corlaez


1 Answers

It will traverse the whole stream, submitting tasks to fork-join pool, splitting the list to parts and passing all the list elements to this empty lambda. Currently it's impossible to check in runtime whether the lambda expression is empty or not, thus it cannot be optimized out.

Similar problem appears in using Collector. All collectors have the finisher operation, but in many cases it's an identity function like x -> x. In this case sometimes the code which uses collectors can be greatly optimized, but you cannot robustly detect whether the supplied lambda is identity or not. To solve this an additional collector characteristic called IDENTITY_FINISH was introduced instead. Were it possible to robustly detect whether supplied lambda is identity function, this characteristic would be unnecessary.

Also look at JDK-8067971 discussion. This proposes creating static constants like Predicate.TRUE (always true) or Predicate.FALSE (always false) to optimize operations like Stream.filter. For example, if Predicate.TRUE is supplied, then filtering step can be removed, and if Predicate.FALSE is supplied, then stream can be replaced with empty stream at this point. Again were it possible to detect in runtime that the supplied predicate is always true, then it would be unnecessary to create such constants.

like image 166
Tagir Valeev Avatar answered Apr 26 '23 17:04

Tagir Valeev