I'm trying to understand flatMap: flatMap(x->stream.of(x) ) does not flat the stream and flatMap(x->x.stream()) works and gives the desired result.
Can someone explain the difference between two?
import java.util.*;
import java.util.stream.*;
class TestFlatMap{
public static void main(String args[]){
List<String> l1 = Arrays.asList("a","b");
List<String> l2 = Arrays.asList("c","d");
Stream.of(l1, l2).flatMap((x)->Stream.of(x)).forEach((x)->System.out.println(x));
Stream.of(l1, l2).flatMap((x)->x.stream()).forEach((x)->System.out.println(x));
}
}
Output :
[a, b]
[c, d]
a
b
c
d
Stream.of(x) produces a Stream of a single element - x. Therefore, flatMap returns a Stream<List<String>> instead of Stream<String>.
On the other hand, x.stream() where x is a Collection<E> returns a Stream<E> whose source are the elements of the Collection, so in your case it returns a Stream<String>, which allows flatMap to produce a Stream<String> containing all the Strings in all the List<String>s of the source Stream.
You can see that in the Javadoc:
<T> Stream<T> java.util.stream.Stream.of(T t)
Returns a sequential Stream containing a single element.
vs.
Stream<E> stream()
Returns a sequential Stream with this collection as its source.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With