Der Unterschied zwischen map () und flatMap ()

Der Unterschied zwischen map () und flatMap ()

1. Überblick

map() undflatMap() APIs stammen aus funktionalen Sprachen. In Java 8 finden Sie sie inOptional, Stream und inCompletableFuture (although unter etwas anderem Namen.

Streams stellen eine Folge von Objekten dar, während Optionals Klassen sind, die einen Wert darstellen, der vorhanden sein oder fehlen kann. Unter anderen aggregierten Operationen haben wir die Methodenmap() undflatMap().

Trotz der Tatsache, dass beide die gleichen Rückgabetypen,haben, sind sie sehr unterschiedlich. Lassen Sie uns diese Unterschiede erklären, indem wir einige Beispiele für Streams und Optionen analysieren.

Weitere Lektüre:

Iteriere über eine Karte in Java

Erfahren Sie, wie Sie durch die Einträge einer Karte in Java iterieren können.

Read more

Kartenserialisierung und Deserialisierung mit Jackson

Eine schnelle und praktische Anleitung zum Serialisieren und Deserialisieren von Java Maps mit Jackson.

Read more

Wie speichere ich doppelte Schlüssel in einer Karte in Java?

Eine schnelle und praktische Anleitung zum Umgang mit doppelten Schlüsseln mithilfe von Multimaps in Java.

Read more

2. Karte und Flatmap in Optionals

Die Methodemap() funktioniert gut mitOptional - wenn die Funktion den genauen Typ zurückgibt, den wir benötigen:

Optional s = Optional.of("test");
assertEquals(Optional.of("TEST"), s.map(String::toUpperCase));

In komplexeren Fällen erhalten wir jedoch möglicherweise eine Funktion, die auchOptional zurückgibt. In solchen Fällen würde die Verwendung vonmap() zu einer verschachtelten Struktur führen, da die Implementierung vonmap()intern einen zusätzlichen Umbruch durchführt.

Sehen wir uns ein weiteres Beispiel an, um diese Situation besser zu verstehen:

assertEquals(Optional.of(Optional.of("STRING")),
  Optional
  .of("string")
  .map(s -> Optional.of("STRING")));

Wie wir sehen können, erhalten wir die verschachtelte StrukturOptional<Optional<String>>.. Obwohl dies funktioniert, ist die Verwendung ziemlich umständlich und bietet keine zusätzliche Nullsicherheit. Daher ist es besser, eine flache Struktur beizubehalten.

Genau das hilft unsflatMap():

assertEquals(Optional.of("STRING"), Optional
  .of("string")
  .flatMap(s -> Optional.of("STRING")));

3. Karte und Flatmap in Streams

Beide Methoden funktionieren fürOptional ähnlich.

Die Methodemap() umschließt die zugrunde liegende Sequenz in einer Instanz vonStream, während die MethodeflatMap()die Vermeidung verschachtelterStream<Stream<R>>-Strukturen ermöglicht.

Im folgenden Beispiel erzeugtmap() einStream, das aus den Ergebnissen der Anwendung dertoUpperCase()-Methode auf die Elemente der EingabeStream: besteht

List myList = Stream.of("a", "b")
  .map(String::toUpperCase)
  .collect(Collectors.toList());
assertEquals(asList("A", "B"), myList);

map() funktioniert in einem so einfachen Fall ziemlich gut, aber was ist, wenn wir etwas Komplexeres haben, wie eine Liste von Listen als Eingabe.

Mal sehen, wie es funktioniert:

List> list = Arrays.asList(
  Arrays.asList("a"),
  Arrays.asList("b"));
System.out.println(list);

Dieses Snippet druckt eine Liste von Listen[[a], [b]].. Verwenden wir nun einflatMap():

System.out.println(list
  .stream()
  .flatMap(Collection::stream)
  .collect(Collectors.toList()));

Das Ergebnis eines solchen Snippets wird auf[a, b]. abgeflacht

TDie MethodeflatMap() reduziert zuerst die EingabeStream vonStreams aufStream vonStrings (weitere Informationen zum Abflachen finden Sie inarticle) s). Danach funktioniert es ähnlich wie bei dermap()-Methode.

4. Fazit

Java 8 bietet uns die Möglichkeit, die Methodenmap() undflatMap() zu verwenden, die ursprünglich in funktionalen Sprachen verwendet wurden.

Wir können sie aufStreams und Optionals aufrufen. Mithilfe dieser Methoden können Sie Objekte zuordnen, indem Sie die bereitgestellte Zuordnungsfunktion anwenden.

Wie immer können Sie die Beispiele in diesem Artikelover on GitHub lesen.