Perfect π β hereβs a visual diagram showing how .map() and .flatMap() work in Java Streams.
Visualizing .map() vs .flatMap()1οΈβ£ .map() β One-to-One Transformation
γ³γΌγγγ³γγΌ
Input Stream: [ "apple", "banana" ]
.map(String::length)
β
βΌ
Output Stream: [ 5, 6 ]
- Each element β exactly one transformed element
- Result:
Stream<Integer> - No flattening happens.
2οΈβ£ .flatMap() β One-to-Many Transformation + Flattening
γ³γΌγγγ³γγΌ
Input Stream: [ "apple banana", "cherry date" ]
.flatMap( phrase -> Arrays.stream(phrase.split(" ")) )
β
βΌ
Intermediate: [ Stream("apple","banana"), Stream("cherry","date") ]
β
βΌ (flatten)
Output Stream: [ "apple", "banana", "cherry", "date" ]
- Each element β multiple elements (via a sub-stream)
- Flattened into a single stream
- Result:
Stream<String>without nesting.
Side-by-Side Summary
γ³γΌγγγ³γγΌ
.map() : Stream<T> β Stream<R>
.flatMap() : Stream<T> β Stream<R> (flattened from Stream<Stream<R>>)
Code RecapJava
γ³γΌγγγ³γγΌ
import java.util.*;
import java.util.stream.*;
public class MapFlatMapVisual {
public static void main(String[] args) {
// map example
List<Integer> lengths = Arrays.asList("apple", "banana").stream()
.map(String::length)
.collect(Collectors.toList());
System.out.println("map() result: " + lengths); // [5, 6]
// flatMap example
List<String> words = Arrays.asList("apple banana", "cherry date").stream()
.flatMap(s -> Arrays.stream(s.split(" ")))
.collect(Collectors.toList());
System.out.println("flatMap() result: " + words); // [apple, banana, cherry, date]
}
}
If you want, I can also give you a cheat sheet of the most common .map() and .flatMap() patterns in Java so you can quickly pick the right one in real projects.
Do you want me to prepare that cheat sheet?