Collectors
Klassen sind Hilfsklassen zum Sammeln und Zusammenfassen von Streams. Es bietet viele Methoden zum Gruppieren, Zählen, Konvertieren, Partitionieren, Verbinden, Reduzieren und anderen Vorgängen im Stream, wodurch die Verarbeitung von Erfassungsdaten komfortabler wird.
Bei Verwendung Collectors
der Klasse können wir verschiedene Verarbeitungsmethoden für den Stream implementieren, indem wir die darin enthaltenen Methoden aufrufen. Um beispielsweise die Elemente im Stream in einer Liste zu sammeln, können Sie toList()
die Methode verwenden; um nach bestimmten Bedingungen zu gruppieren, können Sie groupingBy()
die Methode verwenden; um die Anzahl der Elemente im Stream zu zählen, können Sie counting()
die Methode usw. verwenden An.
Darüber hinaus unterstützt die Klasse auch benutzerdefinierte Collectors. Das heißt, wir können benutzerdefinierte Collectors schreiben, die Collectors
die Schnittstelle entsprechend unseren eigenen Anforderungen implementieren , und sie dann direkt im Code verwenden. Collector
Diese Funktion ist in einigen komplexen Anwendungsszenarien sehr nützlich.
Konvertieren
auflisten()
Collectors.toList()
Eine Methode ist eine von einer Klasse in Java bereitgestellte Methode Collectors
zum Sammeln von Elementen in einem Stream in einer Sammlung.List
List<Integer> list = Stream.of(1, 2, 3, 4, 5)
.collect(Collectors.toList());
Im obigen Beispiel erstellen wir einen ganzzahligen Stream mit 1 bis 5 und verwenden die collect
Methode mit der Collectors.toList()
Methode, um die Elemente im Stream in einer List
Sammlung zu sammeln. Die resultierende list
Sammlung enthält alle Elemente im Stream, d. h {1, 2, 3, 4, 5}
.
Es ist zu beachten, dass Collectors.toList()
die Methode eine unveränderliche List
Sammlung zurückgibt, sodass sie nicht hinzugefügt oder gelöscht werden kann, die darin enthaltenen Elemente jedoch geändert werden können. Wenn wir eine modifizierbare Sammlung benötigen List
, können wir sie wie folgt umwandeln ArrayList
:
List<Integer> list = Stream.of(1, 2, 3, 4, 5)
.collect(Collectors.toCollection(ArrayList::new));
Im obigen Code verwenden wir Collectors.toCollection()
die Methode und geben den zu erstellenden Sammlungstyp an ArrayList
, damit wir eine veränderbare List
Sammlung erhalten können.
Kurz gesagt, Collectors.toList()
diese Methode wird in der tatsächlichen Entwicklung sehr häufig verwendet. Sie kann die Elemente im Stream bequem in einer List
Sammlung sammeln und unsere Datenverarbeitungsanforderungen weiter erfüllen.
toSet()
Collectors.toSet()
Eine Methode ist eine von einer Klasse in Java bereitgestellte Methode Collectors
zum Sammeln von Elementen in einem Stream in einer Sammlung.Set
Set<Integer> set = Stream.of(1, 2, 3, 4, 5)
.collect(Collectors.toSet());
Im obigen Beispiel erstellen wir einen ganzzahligen Stream mit 1 bis 5 und verwenden die collect
Methode mit der Collectors.toSet()
Methode, um die Elemente im Stream in einer Set
Sammlung zu sammeln. Die resultierende set
Sammlung enthält alle Elemente im Stream, d. h {1, 2, 3, 4, 5}
.
Es ist zu beachten, dass Collectors.toSet()
die Methode eine unveränderliche Set
Sammlung zurückgibt, sodass sie nicht hinzugefügt oder gelöscht werden kann, die darin enthaltenen Elemente jedoch geändert werden können. Wenn wir eine modifizierbare Sammlung benötigen Set
, können wir sie wie folgt umwandeln HashSet
:
Set<Integer> set = Stream.of(1, 2, 3, 4, 5)
.collect(Collectors.toCollection(HashSet::new));
Im obigen Code verwenden wir Collectors.toCollection()
die Methode und geben den zu erstellenden Sammlungstyp an HashSet
, damit wir eine veränderbare Set
Sammlung erhalten können.
Collectors.toSet()
Diese Methode wird in der tatsächlichen Entwicklung sehr häufig verwendet. Sie kann die Elemente im Stream bequem in einer Set
Sammlung sammeln und unsere Datenverarbeitungsanforderungen weiter erfüllen.
toCollection(Supplier<C>collectionFactory)
Collectors.toCollection(Supplier<C> collectionFactory)
Eine Methode ist eine von einer Klasse in Java Collectors
bereitgestellte Methode zum Sammeln von Elementen in einem Stream in einer Sammlung eines bestimmten Typs.
Die Methode benötigt ein Argument, eine Supplier<C>
funktionale Schnittstelle vom Typ, wobei C
es sich um den Typ der zu erstellenden Sammlung handelt. Wenn wir beispielsweise eine LinkedList
Sammlung erstellen möchten, könnten wir diese Methode wie folgt verwenden:
List<Integer> list = Stream.of(1, 2, 3, 4, 5)
.collect(Collectors.toCollection(LinkedList::new));
Im obigen Beispiel verwenden wir Collectors.toCollection()
die Methode und übergeben eine LinkedList::new
Funktion, um eine LinkedList
Sammlung vom Typ zu erstellen. Die resultierende list
Sammlung enthält alle Elemente im Stream, d. h {1, 2, 3, 4, 5}
.
Es ist zu beachten, dass Collectors.toCollection()
die Methode eine veränderbare Sammlung zurückgibt, sodass diese hinzugefügt oder gelöscht werden kann.
Kurz gesagt, Collectors.toCollection()
diese Methode wird in der tatsächlichen Entwicklung sehr häufig verwendet. Sie kann die Elemente im Stream bequem in einem bestimmten Sammlungstyp sammeln, um unsere Datenverarbeitungsanforderungen weiter zu erfüllen. Gleichzeitig ist diese Methode sehr flexibel und es können verschiedene Arten von Sammlungsfabriken übergeben werden, um je nach tatsächlichem Bedarf unterschiedliche Arten von Sammlungen zu erstellen.
toConcurrentMap
Collectors.toConcurrentMap()
Eine Methode ist eine von einer Klasse in Java bereitgestellte Methode Collectors
zum Sammeln der Elemente in einem Stream in einer gleichzeitigen . Map
Es verfügt über mehrere Überladungen, von denen die einfachste keinen Map
übergebenen Implementierungstyp erfordert:
ConcurrentMap<Integer, String> concurrentMap = Stream.of("a", "b", "c")
.collect(Collectors.toConcurrentMap(
String::length,
Function.identity()
));
Im obigen Beispiel haben wir toConcurrentMap()
die Methode verwendet, um eine Parallelität Map
mit der Länge der Zeichenfolge als Schlüssel und der Zeichenfolge selbst als Wert zu erstellen. Konkret akzeptiert diese Methode zwei Parameter:
- Eine funktionale Schnittstelle
keyMapper
, die ausdrückt, wie Elemente im Stream in Schlüssel umgewandelt werden; - Eine funktionale Schnittstelle,
valueMapper
die ausdrückt, wie Elemente eines Streams in Werte konvertiert werden.
Für den Stream im obigen Beispiel String::length
konvertiert die funktionale Schnittstelle die Zeichenfolge in ihre Länge und Function.identity()
die funktionale Schnittstelle ordnet die Zeichenfolge sich selbst zu. Das so erhaltene Ergebnis ist:
{1=a, 2=b, 3=c}
toConcurrentMap()
Es ist zu beachten, dass die Methode eine Ausnahme auslöst , wenn der Stream doppelte Schlüssel enthält IllegalStateException
. Über den dritten Parameter können wir angeben, wie das Problem doppelter Schlüssel gelöst werden soll. Wenn wir beispielsweise die Werte, die doppelten Schlüsseln entsprechen, in einer Zeichenfolge kombinieren möchten, können wir diese Methode wie folgt verwenden:
ConcurrentMap<Integer, String> concurrentMap = Stream.of("aa", "bbb", "cc")
.collect(Collectors.toConcurrentMap(
String::length,
Function.identity(),
(s1, s2) -> s1 + "|" + s2
));
Im obigen Beispiel übergeben wir eine Zusammenführungsfunktion (s1, s2) -> s1 + "|" + s2
. Wenn doppelte Schlüssel vorhanden sind, werden die entsprechenden Werte zusammengeführt und |
durch getrennt. Das so erhaltene Ergebnis ist:
{2=aa|cc, 3=bbb}
Collectors.toConcurrentMap()
Diese Methode wird in der tatsächlichen Entwicklung sehr häufig verwendet. Sie kann die Elemente im Stream bequem in einer Parallelität sammeln Map
und bietet eine umfassende Möglichkeit, Probleme wie doppelte Schlüssel zu lösen.
toMap
Collectors.toMap()
Map
Methode ist eine Methode , mit der die Elemente des Streams in einer . Es verfügt über mehrere Überladungen, von denen die einfachste keinen Map
übergebenen Implementierungstyp erfordert:
Map<Integer, String> map = Stream.of("a", "b", "c")
.collect(Collectors.toMap(
String::length,
Function.identity()
));
Im obigen Beispiel haben wir toMap()
eine mit der Methode erstellt Map
, die die Länge der Zeichenfolge als Schlüssel und die Zeichenfolge selbst als Wert verwendet. Konkret akzeptiert diese Methode zwei Parameter:
- Eine funktionale Schnittstelle
keyMapper
, die ausdrückt, wie Elemente im Stream in Schlüssel umgewandelt werden; - Eine funktionale Schnittstelle,
valueMapper
die ausdrückt, wie Elemente eines Streams in Werte konvertiert werden.
Für den Stream im obigen Beispiel String::length
konvertiert die funktionale Schnittstelle die Zeichenfolge in ihre Länge und Function.identity()
die funktionale Schnittstelle ordnet die Zeichenfolge sich selbst zu. Das so erhaltene Ergebnis ist:
{1=a, 2=b, 3=c}
toMap()
Es ist zu beachten, dass die Methode eine Ausnahme auslöst , wenn der Stream doppelte Schlüssel enthält IllegalStateException
. Über den dritten Parameter können wir angeben, wie das Problem doppelter Schlüssel gelöst werden soll. Wenn wir beispielsweise die Werte, die doppelten Schlüsseln entsprechen, in einer Zeichenfolge kombinieren möchten, können wir diese Methode wie folgt verwenden:
Map<Integer, String> map = Stream.of("aa", "bbb", "cc")
.collect(Collectors.toMap(
String::length,
Function.identity(),
(s1, s2) -> s1 + "|" + s2
));
Im obigen Beispiel übergeben wir eine Zusammenführungsfunktion (s1, s2) -> s1 + "|" + s2
. Wenn doppelte Schlüssel vorhanden sind, werden die entsprechenden Werte zusammengeführt und |
durch getrennt. Das so erhaltene Ergebnis ist:
{2=aa|cc, 3=bbb}
Collectors.toMap()
Diese Methode wird in der tatsächlichen Entwicklung sehr häufig verwendet. Sie kann die Elemente im Stream bequem in einem zusammenfassen Map
und bietet umfassende Möglichkeiten zur Behebung von Problemen wie doppelten Schlüsseln.
Gruppe
groupingBy(Funktion<? super T, ? erweitert K> Klassifikator)
Collectors.groupingBy()
Die Methode ist eine von der Klasse in Java Collectors
bereitgestellte Methode , um die Elemente im Stream gemäß dem angegebenen Klassifizierer zu gruppieren. Konkret akzeptiert die Methode einen Parameter:
- Eine funktionale Schnittstelle,
classifier
die darstellt, wie Elemente in einem Stream klassifiziert werden.
Diese Methode hat zwei überladene Formen, von denen die einfachste nur eine Klassifikatorfunktion übergeben muss:
Map<K, List<T>> map = stream.collect(Collectors.groupingBy(classifier));
In,
stream
ist der zu verarbeitende Stream;classifier
ist eine funktionale Schnittstelle zum Zuordnen jedes Elements im Stream zu einem SortierschlüsselK
.
Wir haben beispielsweise eine Liste mit Zeichenfolgen und möchten diese nach Zeichenfolgenlänge gruppieren:
List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
Map<Integer, List<String>> map = list.stream().collect(Collectors.groupingBy(String::length));
Im obigen Code verwenden wir String::length
die funktionale Schnittstelle, um einen String in seine Länge umzuwandeln und ihn als Sortierschlüssel zu verwenden. Das Ergebnis der Operation ist wie folgt:
{3=[date], 5=[apple, cherry], 6=[banana], 10=[elderberry]}
Es ist zu beachten, dass groupingBy()
die Methode ein Map
Objekt zurückgibt, wobei der Schlüssel der Kategorieschlüssel und der Wert eine Liste von Elementen ist, die dem Kategorieschlüssel entsprechen. Im obigen Beispiel gibt es zwei Zeichenfolgen mit der Länge 5, daher werden beide derselben Liste hinzugefügt.
Zusätzlich zu den oben genannten Methoden Collectors.groupingBy()
stellt die Methode auch einen zweiten Parameter bereit downstream
, der zur weiteren Verarbeitung der gruppierten Ergebnisse verwendet wird. Beispielsweise können wir Collectors.counting()
die Methode verwenden, um die Anzahl der Elemente in jeder Gruppe zu zählen:
Map<Integer, Long> map = list.stream()
.collect(Collectors.groupingBy(String::length, Collectors.counting()));
Im obigen Code verwenden wir Collectors.counting()
die Methode als Downstream-Parameter, zählen die Anzahl der Elemente in jeder Gruppe und kapseln das Ergebnis als Long-Typ. Das Ergebnis der Operation ist wie folgt:
{3=1, 5=2, 6=1, 10=1}
Collectors.groupingBy()
Methode ist eine sehr leistungsfähige Gruppierungsoperation in Java, die die Elemente im Stream gemäß dem angegebenen Klassifikator gruppieren kann und verschiedene weitere Verarbeitungsmethoden wie Statistiken, Aggregation, Sortierung usw. unterstützt.
groupingByConcurrent(Function<? super T, ? erweitert K> Klassifikator)
Collectors.groupingByConcurrent()
Die Methode Collectors.groupingBy()
ist der Methode sehr ähnlich. Beide werden verwendet, um die Elemente im Stream gemäß dem angegebenen Klassifikator zu gruppieren. Der Unterschied Collectors.groupingBy()
besteht darin, dass Collectors.groupingByConcurrent()
die Methode ein threadsicheres (gleichzeitiges) ConcurrentMap
Objekt zurückgibt.
groupingByConcurrent()
Die Verwendung der Methode groupingBy()
ähnelt der von , außerdem gibt es zwei überladene Formen. Die einfachste Form ist wie folgt:
ConcurrentMap<K, List<T>> map = stream.collect(Collectors.groupingByConcurrent(classifier));
In,
stream
ist der zu verarbeitende Stream;classifier
ist eine funktionale Schnittstelle zum Zuordnen jedes Elements im Stream zu einem SortierschlüsselK
.
Wir haben beispielsweise eine Liste mit Zeichenfolgen und möchten diese nach Zeichenfolgenlänge gruppieren:
List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
ConcurrentMap<Integer, List<String>> map = list.parallelStream()
.collect(Collectors.groupingByConcurrent(String::length));
Im obigen Code verwenden wir parallelStream()
die Methode, um die Liste in einen parallelen Stream umzuwandeln, um Vorgänge in einer Multithread-Umgebung zu gruppieren. Das Ergebnis der Operation ist wie folgt:
{3=[date], 5=[apple, cherry], 6=[banana], 10=[elderberry]}
Es ist zu beachten, dass groupingByConcurrent()
die Methode groupingBy()
wie die Methode ein Map
Objekt zurückgibt, wobei der Schlüssel der Kategorieschlüssel und der Wert eine Liste von Elementen ist, die dem Kategorieschlüssel entsprechen. Im obigen Beispiel gibt es zwei Zeichenfolgen mit der Länge 5, daher werden beide derselben Liste hinzugefügt.
Collectors.groupingByConcurrent()
Die Methode Collectors.groupingBy()
ist der Methode sehr ähnlich und kann als Thread-sichere und nicht-Thread-sichere Version der Gruppierungsoperation betrachtet werden. In einer Multithread-Umgebung groupingByConcurrent()
weist die Methode eine bessere Leistung und Parallelität auf und eignet sich für die Verarbeitung großer Datenmengen und Szenarien mit hoher Parallelität, beansprucht jedoch entsprechend mehr Systemressourcen.
Kartierung()
Collectors.mapping()
Die Methode ist ein neuer Collector (Collector) in Java 8. Es kann verwendet werden, um Elemente in einem Stream abzubilden, bevor sie mit anderen Kollektoren verarbeitet werden.
mapping()
Die Methode ist wie folgt definiert:
public static <T, U, A, R> Collector<T, ?, R> mapping(
Function<? super T, ? extends U> mapper,
Collector<? super U, A, R> downstream)
In,
mapper
ist eine funktionale Schnittstelle zum Zuordnen jedes Elements im Stream;downstream
Ist ein weiterer Kollektor für weitere Operationen an den zugeordneten Elementen.
mapping()
Die Methode wendet mapper
die Funktion auf die Elemente im Stream an und übergibt das Ergebnis downstream
zur weiteren Verarbeitung an den Kollektor. Abschließend werden die Ergebnisse zum Endergebnis zusammengefasst.
Wir haben beispielsweise eine Liste mit Zeichenfolgen und möchten die Anzahl des Vorkommens von Zeichen in jeder Zeichenfolge zählen. Sie können mapping()
die Methode verwenden, um jede Zeichenfolge einem Map
Objekt mit der Anzahl der Vorkommen eines Zeichens zuzuordnen, und dann die Methode verwenden, um toMap()
alle Map
zusammenzuführen , um das Endergebnis zu erhalten:
List<String> list = Arrays.asList("apple", "banana", "cherry", "date", "elderberry");
Map<Character, Integer> resultMap = list.stream()
.flatMapToInt(String::chars) // 将每个字符串转换为字符流
.mapToObj(c -> (char) c) // 将每个字符转换为包装类型
.collect(Collectors.mapping(
Function.identity(), // 将字符作为 KEY
Collectors.groupingBy(c -> c, Collectors.summingInt(c -> 1)) // 统计每个字符出现的次数
))
.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
Im obigen Code verwenden wir zunächst flatMapToInt()
die Methode, um die Zeichenfolge in ein IntStream
Objekt zu konvertieren, und verwenden dann mapToObj()
die Methode, um jedes Zeichen in einen Wrapper-Typ zu konvertieren. Dann verwenden wir mapping()
die Methode, um jedes Zeichen zu gruppieren und zu zählen, mehrere Objekte abzurufen Map
und schließlich toMap()
die Methode zu verwenden, um sie zu kombinieren, um das Endergebnis zu erhalten.
Es ist zu beachten, dass mapping()
wir in der Methode an den zweiten Parameter Collectors.groupingBy()
die Methode übergeben, was bedeutet, dass wir die Elemente zuerst gruppiert haben. Der zweite groupingBy()
Parameter der Methode ist Collectors.summingInt()
die Methode, was bedeutet, dass wir für jede Gruppe von Elementen eine Summenoperation durchführen.
Collectors.mapping()
Die Methode ist sehr flexibel und kann in Verbindung mit anderen Kollektoren verwendet werden, um komplexere Datenverarbeitungsvorgänge zu erreichen
Partition
partitioningBy(Predicate<? super T> predicate)
Collectors.partitioningBy(Predicate<? super T> predicate) ist ein Collector (Collector) in Java 8, der zum Partitionieren der Elemente im Stream gemäß den Bedingungen des Prädikats und zum Speichern des Partitionsergebnisses in einer Karte verwendet wird Objekt.
Das Parameterprädikat dieser Methode ist ein Prädikat (Prädikat), das die Bedingung zum Filtern der Elemente im Stream darstellt, und sein Rückgabewert ist ein boolescher Typ. Insbesondere wenn die Methode „true“ zurückgibt, sollte das Element in die „true“-Liste der Partition einsortiert werden; wenn sie „false“ zurückgibt, sollte das Element in die „false“-Liste der Partition einsortiert werden.
Angenommen, es gibt eine List<Student>-Studenten vom Typ Student, dann können wir die Methode Collectors.partitioningBy() verwenden, um sie danach zu partitionieren, ob die Punktzahl des Schülers größer oder gleich 60 ist, und das Partitionsergebnis in a speichern Kartenobjekt:
Map<Boolean, List<Student>> result = students.stream()
.collect(Collectors.partitioningBy(s -> s.getScore() >= 60));
Im obigen Code verwenden wir die Methode stream(), um die Liste in einen Stream zu konvertieren, verwenden dann die Methode Collectors.partitioningBy(), um die Elemente im Stream zu partitionieren, und speichern das Ergebnis der Partition im Ergebnis vom Typ Map <Boolean, List<Student>>-Objekt. Im resultierenden Map-Objekt enthält der Teil, dessen Schlüssel „true“ ist, alle Schüler, deren Punktzahl größer oder gleich 60 Punkten ist, und der Teil, dessen Schlüssel „false“ ist, alle Schüler, deren Punktzahl weniger als 60 Punkte beträgt.
Wenn wir die Elemente im Stream nach einem bestimmten Attribut partitionieren müssen, können wir die Methodenreferenz anstelle des Lambda-Ausdrucks verwenden. Unter der Annahme, dass der Typ „Student“ beispielsweise über das boolesche Attribut isMale verfügt, das angibt, ob der Student männlich ist, können wir die Studenten mit dem folgenden Code aufteilen:
Map<Boolean, List<Student>> result = students.stream()
.collect(Collectors.partitioningBy(Student::isMale));
Im obigen Code stellt Student::isMale eine statische Methode im Typ Student dar, mit der zurückgegeben wird, ob der Student männlich ist. Daher können wir diese Methode als Prädikatparameter an die Methode Collectors.partitioningBy() übergeben, um die Funktion der Aufteilung der Schüler nach ihrem Geschlecht zu realisieren.
Kurz gesagt, Collectors.partitioningBy(Predicate<? super T> predicate) ist ein sehr nützlicher Collector in Java 8, der die Elemente im Stream nach beliebigen Bedingungen partitionieren und das Ergebnis der Partition in einem Map-Objekt speichern kann bietet uns einen großen Komfort bei der Datenverarbeitung.
partitioningBy(Predicate<? super T> predicate, Collector<? super T, A, D> downstream)
Collectors.partitioningBy(Predicate<? super T> predicate, Collector<? super T, A, D> downstream) ist ein Kollektor (Collector) in Java 8, der zum Partitionieren der Elemente in Stream gemäß den Bedingungen von Predicate verwendet wird. und wenden Sie einen Downstream-Kollektor (Downstream) auf jede Partition an und speichern Sie das Ergebnis der Partition in einem Map-Objekt.
Das erste Parameterprädikat dieser Methode ist ein Prädikat (Prädikat), das die Bedingung zum Filtern der Elemente im Stream darstellt. Elemente, die die Bedingungen erfüllen, werden der wahren Liste der Partition zugewiesen; andernfalls werden sie der falschen Liste der Partition zugewiesen.
Der zweite nachgeschaltete Parameter ist ein nachgeschalteter Kollektor (Collector), der auf die Elemente jeder Partition einwirkt. Der vom Downstream empfangene Typ ist T, der Typ des Zwischenakkumulationsergebnisses ist A und der endgültige Rückgabewerttyp ist D. Normalerweise verwenden wir andere Collectors als Downstream, wie Collectors.toList(), Collectors.toSet(), Collectors.summingInt() und andere Methoden.
Im Folgenden erläutern wir anhand eines Beispiels die Verwendung von Collectors.partitioningBy(Predicate<? super T> predicate, Collector<? super T, A, D> downstream). Angenommen, es gibt eine Liste „List<Person>“ für Personen vom Typ „Person“. Wir müssen Personen, deren Alter größer oder gleich 18 ist, nach Geschlecht unterteilen und die Namen der Personen in jeder Partition in einer Liste<String> speichern. Sie können den folgenden Code verwenden, um Folgendes zu erreichen:
Map<Boolean, List<String>> result = persons.stream()
.collect(Collectors.partitioningBy(
p -> p.getAge() >= 18,
Collectors.mapping(Person::getName, Collectors.toList())));
Im obigen Code verwenden wir die Methode stream(), um die Liste in einen Stream zu konvertieren, verwenden dann die Methode Collectors.partitioningBy(), um die Elemente im Stream zu partitionieren, und speichern die Partitionsergebnisse in Map<Boolean, List< Ergebnisobjekt vom Typ String>>. Unter diesen bedeutet der erste Parameter p -> p.getAge() >= 18 die Partitionierung von Personen, deren Alter größer oder gleich 18 ist, und der zweite Parameter Collectors.mapping(Person::getName, Collectors.toList()) Mittel zur Partitionierung Der Name jeder Person wird einer Liste zugeordnet, und diese Liste wird als Wert der Partition verwendet. Auf diese Weise können wir nach Alter und Geschlecht unterteilen und eine Liste mit den Namen der Personen in jeder Unterteilung erhalten.
Kurz gesagt, Collectors.partitioningBy(Predicate<? super T> predicate, Collector<? super T, A, D> downstream) ist ein sehr nützlicher Collector in Java 8, der die Elemente im Stream nach beliebigen Bedingungen partitionieren und anwenden kann Ein Downstream-Kollektor für jede Partition und das Speichern des Ergebnisses der Partition in einem Map-Objekt, was uns eine große Bequemlichkeit bei der Datenverarbeitung bietet. Gleichzeitig können wir durch die Auswahl eines vernünftigen Downstream-Kollektors komplexere Partitionsvorgänge erreichen.