Zkusim odpovedet trochu srozumitelneji, nez si to tu tradicne zvrhne a nekteri si zacnou nadavat do lopat a podobne.
map a flatMap jsou funkce/procedury vyssiho radu, v tomto pripade ve smyslu, ze jako svuj argument maji proceduru.
Funkce/procedura map dela to, ze vezme kolekci (seznam, stream, apod.) a na kazdy jeji prvek aplikuje predanou proceduru a vrati novou kolekci (seznam, stream).
Stream
.of(1, 2, 3, 4, 5)
.map(x -> x + 1)
.forEach(x -> System.out.println(x));
==> 2, 3, 4, 5, 6
Stream
.of(new int[] {1, 2}, new int[] {3, 4}, new int[] {5, 6, 7})
.map(x -> x.length)
.forEach(x -> System.out.println(x));
==> 2, 2, 3
V prvnim pripade jsou prvky kolekce skalarni hodnoty (cela cisla), v druhem pripade jsou prvky kolekce pole (int[]), ale po kazde pro jednu hodnotu ze vstupni kolekce vytvori pomoci predane procedury prave jednu hodnotu novou.
V pripade flatMap je to slozitejsi, protoze pro kazdou hodnotu ze vstupni kolekce je vytvorena nova kolekce hodnot (ktera muze obsahovat libovolne mnozstvi hodnot, klidne i zadnou) a tyto kolekce jsou pak spojeny v kolekci jednu.
Stream
.of(new int[] {1, 2}, new int[] {3, 4}, new int[] {5, 6, 7})
.flatMapToInt(x -> Arrays.stream(x).map(y -> y + 1))
.forEach(x -> System.out.println(x));
==> 2, 3, 4, 5, 6, 7, 8
Stream
.of(1, 2, 3, 4, 5)
.flatMap(x -> Collections.nCopies(x, x).stream())
.forEach(x -> System.out.println(x));
==> 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5