Java Stream collect() Methodenbeispiele
Java Stream collect() führt eine veränderbare Reduktionsoperation auf den Elementen des Streams durch. Dies ist eine Endoperation.
Was ist eine veränderbare Reduktionsoperation?
Eine veränderbare Reduktionsoperation verarbeitet die Stromelemente und sammelt sie dann in einem veränderbaren Ergebnisbehälter. Sobald die Elemente verarbeitet sind, führt eine Kombinationsfunktion alle Ergebnisbehälter zusammen, um das Ergebnis zu erstellen.
Java Stream collect() Methodensignatur
Es gibt zwei Varianten der Java Stream collect()-Methode.
<R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner)
<R, A> R collect(Collector<? super T, A, R> collector)
Collector ist eine Schnittstelle, die einen Wrapper für die Supplier-, Accumulator- und Combiner-Objekte bereitstellt. Die zweite Methode ist nützlich, wenn wir die Collectors-Klasse verwenden, um eine integrierte Collector-Implementierung bereitzustellen. Die drei Parameter der collect()-Funktion sind:
- supplier: eine Funktion, die einen neuen veränderbaren Ergebnisbehälter erstellt. Für die parallele Ausführung kann diese Funktion mehrmals aufgerufen werden und muss jedes Mal einen neuen Wert zurückgeben.
- accumulator ist eine zustandslose Funktion, die ein Element in einen Ergebnisbehälter einfügen muss.
- combiner ist eine zustandslose Funktion, die zwei teilweise Ergebnisbehälter annimmt und zusammenführt, was mit der accumulator Funktion kompatibel sein muss.
Stream collect() Methodenbeispiele
Lassen Sie uns einige Beispiele für die Stream.collect()-Methode betrachten.
1. Verkettung von Zeichenkettenlisten
Angenommen, Sie möchten die Liste der Zeichenketten verkettet, um eine neue Zeichenkette zu erstellen. Wir können die Stream collect()-Funktion verwenden, um eine veränderbare Reduktionsoperation durchzuführen und die Listenelemente zu verkettet.
List<String> vowels = List.of("a", "e", "i", "o", "u"); // sequential stream - nothing to combine
StringBuilder result = vowels.stream().collect(StringBuilder::new, (x, y) -> x.append(y),
(a, b) -> a.append(",").append(b));
System.out.println(result.toString());
// parallel stream - combiner is combining partial results
StringBuilder result1 = vowels.parallelStream().collect(StringBuilder::new, (x, y) -> x.append(y),
(a, b) -> a.append(",").append(b));
System.out.println(result1.toString());
Output:
aeiou
a,e,i,o,u
2. Stream collect() zu einer Liste mit der Collectors-Klasse
Die Collectors-Klasse bietet viele nützliche Implementierungen der Collector-Schnittstelle. Betrachten wir ein Beispiel, bei dem wir die Liste der Ganzzahlen filtern, um nur gerade Zahlen auszuwählen. Stream filter() ist eine Zwischenoperation und gibt einen Stream zurück. Daher werden wir die collect()-Funktion verwenden, um die Liste aus diesem Stream zu erstellen.
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());
System.out.println(evenNumbers); // [2, 4, 6]
3. Stream collect() zu einem Set
Wir können Collectors.toSet() verwenden, um die Stromelemente in ein neues Set zu sammeln.
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6);
Set<Integer> oddNumbers = numbers.parallelStream().filter(x -> x % 2 != 0).collect(Collectors.toSet());
System.out.println(oddNumbers); // [1, 3, 5]
4. Collectors joining() Beispiel
Wir können Collectors.joining()-Methoden verwenden, um einen Collector zu erhalten, der die Eingabe-CharSequence-Elemente des Streams in der Begegnungsreihenfolge verkettet. Wir können dies verwenden, um einen Stream von Zeichenketten, StringBuffer oder StringBuilder zu verkettet.
jshell> String value = Stream.of("a", "b", "c").collect(Collectors.joining());
value ==> "abc"
jshell> String valueCSV = Stream.of("a", "b", "c").collect(Collectors.joining(","));
valueCSV ==> "a,b,c"
jshell> String valueCSVLikeArray = Stream.of("a", "b", "c").collect(Collectors.joining(",", "{", "}"));
valueCSVLikeArray ==> "{a,b,c}"
jshell> String valueObject = Stream.of("1", new StringBuffer("2"), new StringBuilder("3")).collect(Collectors.joining());
valueObject ==> "123"
Fazit
Java Stream collect() wird meistens verwendet, um die Stromelemente in einer Sammlung zu sammeln. Es ist eine Endoperation. Sie kümmert sich um die Synchronisation, wenn sie mit einem parallelen Stream verwendet wird. Die Collectors-Klasse bietet viele Collector-Implementierungen, um uns zu unterstützen.