The Stream API allows you to process collections of data (like filtering, mapping, sorting) in a declarative and efficient way.
✅ Think of a stream as a pipeline of operations applied to a sequence of elements.
🧱 Key Concepts
| Concept |
Description |
| Stream |
A sequence of elements supporting sequential & parallel operations |
| Intermediate Operations |
Return a new stream (lazy evaluation) — e.g., map, filter
|
| Terminal Operations |
Produces a result or side-effect — e.g., collect, forEach
|
| Pipeline |
Chaining of operations in a readable flow |
🔁 Stream Pipeline Structure
Collection.stream()
.filter(...) // Intermediate
.map(...) // Intermediate
.collect(...) // Terminal
✅ Real-Life Example
🔧 Common Stream Methods
🧩 Intermediate Operations (do not trigger execution)
| Method |
Purpose |
filter() |
Filters elements by condition |
map() |
Transforms each element |
sorted() |
Sorts elements |
distinct() |
Removes duplicates |
limit(n) |
Keeps only first n elements |
skip(n) |
Skips first n elements |
🎯 Terminal Operations (triggers stream execution)
| Method |
Purpose |
forEach() |
Iterates over each element (side-effect) |
collect() |
Converts stream to collection/list/map |
count() |
Counts elements |
reduce() |
Combines elements into one (sum, concat) |
anyMatch() |
Checks if any element matches predicate |
⚡ Stream vs Collection
| Feature |
Collection |
Stream |
| Storage |
Stores elements |
Doesn’t store, just processes |
| Evaluation |
Eager (loads all elements) |
Lazy (runs only on terminal ops) |
| Mutability |
Can modify elements |
Immutable (produces new streams) |
| Multiple use |
Reusable |
Single-use (must recreate) |
| Parallel Support |
Manual with threads |
Easy with .parallelStream()
|
🔥 Parallel Stream Example
✅ Summary
| Attribute |
Value |
| Package |
java.util.stream |
| Key Types |
Stream<T>, IntStream, DoubleStream
|
| Core Ideas |
Functional-style, declarative pipelines |
| Best Used For |
Transforming & processing collections |