flat und flatmap

Mariexshhx

Bekanntes Mitglied
Hallo kann mir jemand den Unterschied zwischen diesen beiden Funktionen erklären ?
Wenn ich die
Code:
Function<Integer, Collection<Double>> wurzeln = n → List.of(-Math.sqrt(n), Math.sqrt(n)) und die Liste List.of(1,2,3)
und jetzt die Wurzeln über die Liste mappe bekomme ich ja (-1,1 und so weiter) aber was würde ich bekommen wenn ich flatmap anwende ? Ich verstehe nicht so ganz den Unterschied

sorry ich meinte natürlich map und flatmap :'D
 
Zuletzt bearbeitet:

blaBra

Mitglied
@Mariexshhx Ich vermute du meinst so etwas:

Java:
import org.apache.commons.lang3.ClassUtils;

import java.util.Collection;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Stream;

public class Neu {
    public static void main(String[] args) {
        Function<Integer, Collection<Double>> wurzeln = n -> List.of(-Math.sqrt(n), Math.sqrt(n));
        Function<Integer, Stream<Double>> wurzeln2 = n -> Stream.of(-Math.sqrt(n), Math.sqrt(n));
        List<Integer> integers = List.of(1, 2, 3);
        integers.stream().map(wurzeln).forEach(o -> System.out.println(ClassUtils.isPrimitiveOrWrapper(o.getClass())));
        integers.stream().flatMap(wurzeln2).forEach(o -> System.out.println(ClassUtils.isPrimitiveOrWrapper(o.getClass())));
    }
}

An der Ausgabe kannst du ablesen was der Unterschied zwischen map und flatMap ist. Benötigt aber Apache commons lang3.
 

Mariexshhx

Bekanntes Mitglied
wäre der Unterschied dann [[-1,1],[-wurzel2, wurzel2],...] ohne flatmap also gibt map Listen innerhalb von Listen zurück
und mit flatmap [-1,1,-wurzel2, wurzel2,..] also gibt eine Liste wieder ? Verstehe ich das richtig ?
 

blaBra

Mitglied
ich freue mich, wenn alle fragen ausgeräumt sind. aber Hierarchie ist vielleicht nicht der passende Begriff, ich meine flache Anordnung oder Struktur. :)
 

httpdigest

Top Contributor
quasi Streams die auf primitiven Typen operieren...
Das ist zu vereinfacht und unpräzise formuliert. "Primitive Typen" in Java bedeutet ja auch was ganz anderes.

Also... wenn wir uns einfach den Typ von map() angucken: (Stream<T>, Function<T, R>) -> Stream<R> dann sehen wir, dass map() eben einfach nur eine Funktion auf jedes der Element T im Eingabestream vom Typ Stream<T> anwendet und als Ergebnis für jedes T eben ein R erhält. Das Ergebnis insgesamt ist dann also ein Stream<R>. Sowohl T als auch R kann hier alles beliebige sein, z.B. selbst auch wieder Streams oder Listen, im Prinzip jeder beliebige Referenztyp.

Wenn wir uns jetzt den Typ von flatMap() angucken: (Stream<T>, Function<T, Stream<R>>) -> Stream<R> dann sehen wir hier einen einzigen Unterschied, nämlich den Typ der Funktion, die für jedes T im Eingabestream angewendet wird. Die Funktion soll hier nämlich kein R zurückliefern, sondern immer einen Stream<R>. Die Funktion kann also für ein T keinen, einen oder sogar mehrere Werte zurückliefern, in Form eine Streams. Und alle diese Streams werden einfach am Ende aneinanderkonkateniert, und ergeben so dann den Gesamt-Ergebnis-Stream vom Typ Stream<R>. Auch hier kann T und R wieder jeder beliebige Referenztyp sein, z.B. auch selber wieder ein Stream.

Ich empfehle, wie in meiner ersten Antwort auch, sich einfach den Stackoverflow Thread https://stackoverflow.com/questions...nce-between-map-and-flatmap-methods-in-java-8 durchzulesen. Da wird das besser erklärt als wir das hier könnten.
 

blaBra

Mitglied
Doch, ich meinte IntStream DoubleStream usw., Es geht nur um die Werte die "zurückgegeben werden" von diesen Streams...

Und naja, jeder Nichtreferenztyp ist primitiv, und davon gibt es nur 7.
 

KonradN

Super-Moderator
Mitarbeiter
Ne, flatMap mappt quasi in einen Stream primitiven Typs. Das ist der Hauptunterschied...
Das ist aber eine generelle Aussage und keine Aussage zu IntStream und co. Und wenn man den Thread betrachtet, dann war von eben diesen davor auch nie die Rede …

Daher war Deine Aussage an der Stelle so extrem missverständlich
 

Ähnliche Java Themen

Neue Themen


Oben