Reputation: 9685
There are several things in Oracle docs that I cannot fully understand:
Operations like forEach and peek are designed for side effects;
What they mean by "designed"? What is so special about those two? I can write my code so that any stream API method works via side effect. It's completely up to me, as far as I can understand. What's more, I would usually use peek() to modify the state of the element, not the source itself, which doesn't make it stateful or side-effect-prone.
The javadoc for forEach also says:
The behavior of this operation is explicitly nondeterministic.
I understand it when they say the same thing about findAny, but what's non-deterministic about forEach? Any operation in parallel stream cannot guarantee ordering if the stream is not ordered. Why is nondeterminism only mentioned for forEach(and finAny, but it means a bit different thing)?
For peek and forEach javadoc also contains:
action may be performed at whatever time and in whatever thread the library chooses
Again, why only there? Why isn't it mentioned for the rest of the operations?
Upvotes: 3
Views: 3331
Reputation: 100199
First, modifying an object state is also a side-effect as the overall state of your program changes after executing your lambda. You can even have a concurrency problem here if you have the same object several times in your parallel stream. Side-effect-free function is a function which does not change the program state and its return value is based only on its arguments. As other stream operations are required to be side-effect-free, it's unnecessary to mention in which thread and at which time they will be executed as this should not matter. But if operation is allowed to have side-effect, this should be mentioned explicitly.
The forEach
differs from forEachOrdered
even if the stream is unordered: forEachOrdered
always guarantees that its lambda is not executed concurrently in several different threads at a time. The forEach
call not only makes your stream implicitly unordered, but also removes this guarantee: your lambda can be executed concurrently now. And as lambda may produce side-effect, this should be mentioned explicitly.
Upvotes: 5