[JAVA] Zum Verständnis von Karte und Flatmap in Stream (1)

Frage

Aus der Liste von zwei Ganzzahlen Generieren Sie eine Liste von "Paaren", die eine Kombination aller Elemente voneinander sind.

ex.) [1,2,3], [5,6] -> [(1,5),(1,6),(2,5),(2,6),(3,5),(3.6)]

trial1 Vielleicht kann ich mit einer Karte gehen.

List<Integer> ints1 = Arrays.asList(1,2,3);
List<Integer> ints2 = Arrays.asList(5,6);
ints1.stream()
     .map( i -> ints2.stream().map( j -> Pair.of(i,j)))
     .collect(toList()); 

Nicht gut. List <Stream <Pair <Integer, Integer >> wird zurückgegeben.

An erster Stelle ... Die Stream.map-Funktion nimmt den Typ Function <? Super T ,? Erweitert R> als Argument und gibt <R> Stream <R> zurück.

Stream map(Function<? super T,? extends R> mapper) ref. Stream.map

Die verschachtelte Karte ist also Gibt Stream <Pair <Integer, Integer >> und zurück Die ursprüngliche Karte, die den Rückgabewert erhalten hat Es wird "Stream <Stream <Pair <Integer, Integer >>>" zurückgegeben.

Und durch die Kündigungsoperation List <Stream <Pair <Integer, Integer >> wird schließlich zurückgegeben. (In Zukunft geht es darum, was die Beendigungsoperation tut ...)

Also flatMap

Mit flatMap Ersetzen Sie jeden Wert von Stream durch einen anderen Stream. Alle generierten Streams werden zu einem einzigen Stream zusammengefasst. ref. Java8 in Action

Per Definition Als Argument an flatMap übergeben Das zweite Argument von "Funktion <? Super T ,? Erweitert Stream <? Erweitert R >> Mapper" ist Es ist ? Erweitert Stream <? Erweitert R> Der Rückgabewert ist Es ist vom Typ R <R> Stream <R>, der den Stream des zweiten Funktionsarguments bildet.

Stream flatMap(Function<? super T,? extends Stream<? extends R>> mapper) ref. flatMap

Basierend auf dem oben Gesagten lautet der Code wie folgt.

ints1.stream()
     .flatMap( i -> ints2.stream().map( j -> Pair.of(i,j)))
     .collect(toList());

flatMap( i -> ints2.stream().map( j -> Pair.of(i,j))) Der von zurückgegebene Typ Mit Stream <Pair <Integer, Intege >>, Die Beendigungsoperation gibt "List <Pair <Integer, Integer >>" zurück.

Mit flatMap Es fühlt sich so an, als würde es Stream, der in trial1 verschachtelt war, gut machen ^^ (Erklärung Sonstiges)

Recommended Posts

Zum Verständnis von Karte und Flatmap in Stream (1)
Unterschied zwischen Stream Map und FlatMap
map, compactMap und flatMap
Verstehe gleich und hashCode in Java
Betrachten wir die Bedeutung von "Stream" und "Collect" in der Stream-API von Java.
Zusammenfassung der Hashes und Symbole in Ruby
[Ruby] Schleifenunterscheidung und Verwendung in Ruby
Diskriminierung von Enum in Java 7 und höher
Versuchen Sie, Scala-ähnliche Optionstyp-Musterübereinstimmung und Map FlatMap in Java zu realisieren
[Verständnis] Unterschied zwischen Hash und Array in Ruby
[Rails] Rangfolge und Paginierung in der Reihenfolge der Likes
Zusammenfassung der häufig verwendeten Befehle in Rails und Docker
Verwendung japanischer Schriftarten und Fremdzeichen in Jasper Report
[Für Anfänger] DI ~ Die Grundlagen von DI und DI im Frühjahr ~
Verwendbarkeit von Datums- und Zeitklasse in jeder Sprache
Verwendung von Abstract Class und Interface in Java richtig
Umgang mit Datum und Uhrzeit in Ruby. Verwenden Sie Datum und Uhrzeit richtig.