Java Developer interview question
When should you use Java streams?
Streams express transformations over data with lazy intermediate operations and a terminal operation; use them for clear stateless pipelines, not side-effect-heavy logic or automatic parallelism.
Direct answer
What a strong answer covers
How it works
A stream describes a pipeline: a source, lazy intermediate operations such as filter and map that run only when a terminal operation like collect or reduce pulls values, and one traversal of the data. Streams make stateless transformations readable and composable; they are the wrong tool when the loop needs an index, early exit with side effects, mutation of external state, or checked exceptions. parallel() splits work across the common ForkJoinPool and only helps for large, CPU-bound, independent elements.
Example
Grouping orders by customer and summing totals reads clearly as orders.stream().collect(groupingBy(Order::customerId, summingLong(Order::total))). A loop that must stop at the first failure and log every attempt is clearer as a plain for statement than a forEach with a flag captured in an AtomicBoolean.
Common mistakes
- Calling parallel() on a small list or on I/O-bound work and slowing it down.
- Mutating a shared collection inside forEach instead of collecting.
- Reusing a stream after a terminal operation and getting IllegalStateException.
A useful answer structure
Answer from your own work.
Do not memorise a script: use only examples you can explain honestly in follow-up questions.
Open the desktop workspace and rehearse a clear answer in your own words.