flatMap in Java
-
Die
flatMap
-Funktion in Java -
Wie man die Methode
flatMap()
in Java verwendet -
Duplikate aus
flatMap
in Java entfernen -
Filterung von
flatMap
-Elementen in Java -
flatMap
und primitiver Typ - Fazit
Dieses Tutorial stellt flatMap
und seine Verwendung in Java vor.
flatMap
ist eine Operation/Funktion im Java-Stream, die verwendet wird, um einen neuen Stream zu erhalten, nachdem eine funktionale Aufgabe ausgeführt wurde. Hier werden wir über die Operation flatMap()
sprechen.
Diese Operation ist eine Erweiterung der Operation map()
. Diese Funktion wird auf jedes Stream-Element angewendet und generiert einen Stream mit neuen Werten.
Die generierten Elemente dieser neuen Streams werden dann in einen kürzlich erstellten Stream kopiert, der als Rückgabewert der Methode dient.
Die flatMap
-Funktion in Java
Die Signatur der Funktion flatMap()
lautet:
<R> Stream<R> flatMap(Function<? super T,? extends Stream<? extends R>> mapper)
flatMap
ist eine Zwischenoperation. Zwischenoperationen sind verzögerte Operationen und werden auf einer Stream-Instanz aufgerufen, und nachdem sie ihre Verarbeitung abgeschlossen haben, geben sie eine Stream-Instanz zurück.
Die Operation flatMap()
ist eine Kombination aus der Operation map()
und flat()
. Das bedeutet, dass die Operation flatMap()
zuerst die Operation map()
anwendet und dann das Ergebnis glättet.
Diese Methode benötigt einen Mapper, eine Funktion, die auf jedes Element des eingehenden Stream
anzuwenden ist.
Abflachung in Java
Lassen Sie uns zuerst verstehen, was Abflachung ist. Durch das Reduzieren einer Liste werden zwei oder mehr Ebenenlisten in eine einzige Ebenenliste konvertiert.
Ein Beispiel für eine zweistufige Liste ist:
[[ "I" ], [ "Love" ], [ "Delft", "Stack" ]]
Die obige Liste wird nach dem Abflachen umgewandelt in:
["I", "Love", "Delft", "Stack"]
Die erzeugte Liste ist eine einstufige Liste.
Notwendigkeit der Verflachung einer Liste
Es ist notwendig, eine Liste zu glätten, da der Umgang mit mehreren Stream-Ebenen schwierig, kompliziert und fehleranfällig sein kann.
Wir können die Operation Stream.flatMap()
verwenden, um die beiden Stream-Ebenen in einen Stream mit einer einzigen Ebene umzuwandeln. Wir werden dies später in diesem Artikel anhand eines Beispiels verstehen.
Wie man die Methode flatMap()
in Java verwendet
In diesem Beispiel haben wir zuerst einen Stream von Objekten aus einer Liste mit der Methode stream()
erstellt. Jedes Objekt ist ein Programmierer in einem Unternehmen.
Wir werden zuerst eine Klasse erstellen, um einen Entwickler/Programmierer in einem Unternehmen darzustellen.
import java.util.HashSet;
import java.util.Set;
class Programmer {
private String name;
private Set<String> languages_known;
public Programmer(String name) {
this.name = name;
this.languages_known = new HashSet<>();
}
public void addLanguage(String lang) {
this.languages_known.add(lang);
}
public Set<String> getLanguages() {
return languages_known;
}
}
Wir werden nun Objekte initialisieren und eine Liste mit Listen erstellen, die alle Sprachen enthalten, die den Programmierern im gesamten Unternehmen bekannt sind. Wir werden diese Liste dann glätten, um alle Sprachen im Team zu beherrschen.
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class SimpleTesting {
public static void main(String[] args) {
Programmer raj = new Programmer("Raj");
raj.addLanguage("Java");
raj.addLanguage("Dart");
raj.addLanguage("go");
raj.addLanguage("groovy");
Programmer karan = new Programmer("Karan");
karan.addLanguage("Java");
karan.addLanguage("Python");
Programmer chahal = new Programmer("Chahal");
chahal.addLanguage("Dart");
chahal.addLanguage("Javascript");
List<Programmer> team = new ArrayList<>();
team.add(raj);
team.add(karan);
team.add(chahal);
System.out.println("Programming languages in the team: ");
List<String> languages = team.stream()
.map(Programmer::getLanguages)
.flatMap(Collection::stream)
.collect(Collectors.toList());
System.out.println(languages);
}
}
Ausgabe:
Programming languages in the team:
[Java, groovy, go, Dart, Java, Python, Javascript, Dart]
Im obigen Beispiel haben wir zuerst einen Stream aller Programmierer erstellt, die die Stream-API verwenden. Danach haben wir mit der Funktion map()
einen Strom von Listen von Sprachen erstellt, die jedem Programmierer bekannt sind.
Duplikate aus flatMap
in Java entfernen
Diese Liste glätten wir dann mit der Operation flatMap()
und wandeln den resultierenden Stream in eine Liste um. Beachten Sie, dass die erzeugte Liste einige doppelte Werte hat; wir verwenden die Operation duplicate()
, um diese zu eliminieren.
Sehen Sie sich den Code unten an.
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class SimpleTesting {
public static void main(String[] args) {
Programmer raj = new Programmer("Raj");
raj.addLanguage("Java");
raj.addLanguage("Dart");
raj.addLanguage("go");
raj.addLanguage("groovy");
Programmer karan = new Programmer("Karan");
karan.addLanguage("Java");
karan.addLanguage("Python");
Programmer chahal = new Programmer("Chahal");
chahal.addLanguage("Dart");
chahal.addLanguage("Javascript");
List<Programmer> team = new ArrayList<>();
team.add(raj);
team.add(karan);
team.add(chahal);
System.out.println("Programming languages in the team: ");
List<String> languages = team.stream()
.map(Programmer::getLanguages)
.flatMap(Collection::stream)
.distinct()
.collect(Collectors.toList());
System.out.println(languages);
}
}
Ausgabe:
Programming languages in the team:
[Java, groovy, go, Dart, Python, Javascript]
Filterung von flatMap
-Elementen in Java
Wenn wir alle Sprachen außer Dart
haben wollen, können wir die Funktion filter()
mit flatMap()
verwenden. Sehen Sie sich den Code unten an.
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
public class SimpleTesting {
public static void main(String[] args) {
Programmer raj = new Programmer("Raj");
raj.addLanguage("Java");
raj.addLanguage("Dart");
raj.addLanguage("go");
raj.addLanguage("groovy");
Programmer karan = new Programmer("Karan");
karan.addLanguage("Java");
karan.addLanguage("Python");
Programmer chahal = new Programmer("Chahal");
chahal.addLanguage("Dart");
chahal.addLanguage("Javascript");
List<Programmer> team = new ArrayList<>();
team.add(raj);
team.add(karan);
team.add(chahal);
System.out.println("Programming languages in the team: ");
List<String> languages = team.stream()
.map(Programmer::getLanguages)
.flatMap(Collection::stream)
.distinct()
.filter(x -> !x.equals("Dart"))
.collect(Collectors.toList());
System.out.println(languages);
}
}
Ausgabe:
Programming languages in the team:
[Java, groovy, go, Python, Javascript]
flatMap
und primitiver Typ
Die Java Stream API bietet auch separate Operationen wie flatMapto{primitive type}
für primitive Datentypen wie int, float, long, um den Stream des primitiven Typs zu glätten.
import java.util.Arrays;
import java.util.stream.IntStream;
import java.util.stream.Stream;
public class SimpleTesting {
public static void main(String[] args) {
int[] Je_array = {3, 5, 2, 35, 85, 32, 23, 43, 12};
Stream<int[]> JE_streamArray = Stream.of(Je_array);
IntStream JE_intStream = JE_streamArray.flatMapToInt(x -> Arrays.stream(x));
JE_intStream.forEach(x -> System.out.println(x));
}
}
Ausgabe:
3
5
2
35
85
32
23
43
12
Fazit
Wir haben die Operation flatMap()
besprochen und warum sie benötigt wird. Wir haben auch besprochen, wie die Java Stream API eine separate flatMap()
-Operation für primitive Datentypen bereitstellt.
Beachten Sie, dass die normale flatMap()
-Operation auch auf primitive Datentypen anwendbar ist.