1. Elemente sammeln

Endlich haben wir die interessanteste Methode der StreamKlasse erreicht, die collect()Methode. Es wird verwendet, um von Streams zu unseren bekannten Sammlungen zu wechseln – , List<T>und andere.Set<T>Map<T, R>

Die collect()Methode verwendet ein spezielles collectorObjekt als Argument. Dieses Objekt liest alle Daten aus dem Stream, konvertiert sie in eine bestimmte Art von Sammlung und gibt sie zurück. Und dann gibt die Collect-Methode selbst diese Sammlung zurück.

All dies geschieht auf ziemlich raffinierte Weise: Der collectorObjekttyp ist Collector<T, A, R>. Wie Sie sehen können, verfügt es über drei Typparameter. Der letzte Typparameter ( R) ist normalerweise ein Typ wie List<T>. Dies bedeutet, dass der Compiler diesen Typ verwenden kann, um den richtigen Rückgabetyp für die collect()Methode selbst zu bestimmen.

Ich hoffe, Sie sind nicht zu verwirrt. In jedem Fall müssen Sie keine Collector-Objekte selbst erstellen. Die von den statischen Methoden der Klasse zurückgegebenen vorgefertigten Objekte Collectorsreichen aus.

Sammlerklasse _

Die CollectorsKlasse verfügt über mehrere statische Methoden, die vorgefertigte Sammlerobjekte zurückgeben – für jeden Anlass etwas. Hier betrachten wir die wichtigsten.

toList()
Ein Objekt, das einen Stream in eine Liste konvertiert ( List<T>)
toSet()
Ein Objekt, das einen Stream in eine Menge umwandelt ( Set<T>)
toMap()
Ein Objekt, das einen Stream in eine Map( Map<K, V>) konvertiert
joining()
Verkettet die Elemente eines Streams zu einer einzelnen Zeichenfolge
mapping()
Konvertiert die Elemente einer Zeichenfolge in aMap<K, V>
groupingBy()
Gruppiert die Elemente und gibt zurückMap<K, V>

2. Konvertieren eines Streams in eine Liste

Das Folgende ist ein typisches Beispiel für die Arbeit mit einem Stream und die Konvertierung des Ergebnisses in eine Liste

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

List<String> result = list.stream()
   .filter( s -> Character.isUpperCase(s.charAt(0)) )
   .collect( Collectors.toList() );

Wir haben einen Stream aus der Sammlung erhalten. Dann haben wir einen neuen Stream erhalten, indem wir nur Zeichenfolgen beibehalten haben, deren erstes Zeichen ein Großbuchstabe ist. Anschließend werden alle Daten aus diesem Stream in einer Sammlung gesammelt, die dann zurückgegeben wird.



3. Konvertieren eines Streams in einen Satz

Das Folgende ist ein typisches Beispiel für die Arbeit mit einem Stream und die Konvertierung des Ergebnisses in eine Menge

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "Hello", "how's", "life?");

Set<String> result = list.stream()
   .filter( s -> Character.isUpperCase(s.charAt(0)) )
   .collect( Collectors.toSet() );

Alles ist dem Code zum Konvertieren eines Streams in einen sehr ähnlich List, nur verwenden wir ein anderes Collector-Objekt, das von der toSet()Methode zurückgegeben wird.



4. Konvertieren eines Streams in eine Karte

Die Konvertierung eines Streams in eine Karte ist jedoch etwas schwieriger. Jeder Eintrag in einer Map besteht aus zwei Elementen: einem Schlüssel und einem Wert. Wir müssen herausfinden, wie wir den Schlüssel und den Wert für jedes Element im Stream definieren.

Beispiel:

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");

Map<String, String> result = list.stream()
   .map( e -> e.split("=") )
   .filter( e -> e.length == 2 )
   .collect( Collectors.toMap(e -> e[0], e -> e[1]) );

Werfen wir einen Blick darauf, was hier vor sich geht.

In der ersten Zeile konvertieren wir map(...)jeden String in ein Array von Strings. Mit der Split-Methode teilen wir jede Zeichenfolge in zwei Teile.

In der zweiten Zeile übergeben wir der filter()Methode nur die Arrays, die genau zwei Elemente enthalten. Die d==3Zeichenfolge wird in ein Array aus drei Elementen aufgeteilt, das nicht mit dem Filter übereinstimmt.

Und schließlich konvertieren wir in der letzten Zeile den Stream in eine Map<String, String>. Der Methode werden zwei Funktionen übergeben toMap(). Für jedes Element des Streams sollte die erste Funktion den Schlüssel und die zweite den Wert zurückgeben .

Das erste Element jedes Arrays („a“, „b“, „c“) ist unser Schlüssel und das zweite Element jedes Arrays („2“, „3“, „4“) ist unser Wert.



5. Konvertieren eines Streams in einen String

Ein weiteres interessantes Sammlerobjekt wird von zurückgegeben Collectors.joining(). Es konvertiert alle Elemente eines Streams in Stringeinen einzigen String und verkettet sie zu einem einzigen String. Beispiel

ArrayList<String> list = new ArrayList<String>();
Collections.addAll(list, "a=2", "b=3", "c=4", "d==3");
String result = list.stream().collect( Collectors.joining(", ") );