The 30 second answer
Sequential runs in the caller thread. Parallel splits the source with a Spliterator and runs on the common ForkJoinPool via parallelStream or parallel. The last parallel or sequential call wins for the whole pipeline. Results match sequential only when lambdas are stateless and non-interfering and the ops are associative.
Sequential runs in the caller thread. Parallel splits the source via Spliterator and runs on the common ForkJoinPool (collection.parallelStream() or .parallel()).
The whole pipeline is either sequential or parallel — the last parallel() / sequential() call wins. Results match sequential only if behavioral parameters are non-interfering and stateless and ops are associative.
Common pool size default ≈ available processors − 1.
Performance tip: prefer primitive streams (mapToInt) to avoid boxing; measure before enabling parallel.
Sources: