Java Stream.collect in Kotlin: vollständiger Leitfaden mit Beispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Wie man aufhört, Stream.collect in Kotlin zu schreiben, und anfängt zu leben



Sind Sie jemals von Java auf Kotlin umgestiegen und haben sich gefühlt wie ein Fisch an Land? Besonders wenn es um Streams ging. In Java 8 waren wir an Ketten wie .stream().filter().map().collect() gewöhnt. Und in Kotlin – zack! – gibt es Stream.collect nicht in der gewohnten Form. Aber keine Panik. Tatsächlich bietet die Standardbibliothek von Kotlin alles, was Sie brauchen, nur bequemer, prägnanter und ohne überflüssigen Ballast.



In diesem Artikel schauen wir uns an, welche Äquivalente zu Java 8 Stream.collect es in Kotlin gibt, und zeigen dies anhand praktischer Beispiele. Wenn Sie nach einer Antwort auf die Frage "What Java 8 Stream.collect equivalents are available in the standard Kotlin library?" suchen – sind Sie hier genau richtig. Wir gehen die gängigsten Operationen durch: vom einfachen Sammeln in einer Liste bis hin zu komplexer Gruppierung und Zeichenkettenverknüpfung.



Bereit? Los geht's!



1. Der einfachste Fall: toList() und toSet()



In Java schreiben Sie, um das Ergebnis eines Streams in einer Liste zu sammeln:



List<String> result = list.stream()    .filter(s -> s.length() > 3)    .collect(Collectors.toList());


In Kotlin wird daraus eine einzige Zeile ohne collect:



val result = list.filter { it.length > 3 }


Ja, Sie haben richtig gehört. filter in Kotlin gibt bereits eine Liste zurück. Wenn Sie jedoch den Sammlungstyp explizit angeben möchten, verwenden Sie toList(), toSet() oder toMutableList():



val numbers = listOf(1, 2, 3, 4, 5, 5)val uniqueNumbers: Set<Int> = numbers.toSet()// Ergebnis: [1, 2, 3, 4, 5]


Fazit: In Kotlin geben die meisten Sammlungsoperationen (filter, map, flatMap) sofort eine Liste zurück. collect(Collectors.toList()) brauchen Sie nicht mehr.



2. Gruppierung: groupingBy statt Collectors.groupingBy



Gruppierung ist eine der häufigsten Aufgaben. In Java sieht das so aus:



Map<Integer, List<String>> byLength = list.stream()    .collect(Collectors.groupingBy(String::length));


In Kotlin gibt es dafür die elegante Funktion groupBy:



val words = listOf("Katze", "Code", "Kessel", "Kätzchen")val byLength = words.groupBy { it.length }// Ergebnis: {5=[Katze], 4=[Code], 6=[Kessel], 7=[Kätzchen]}


Aber es gibt einen Haken: groupBy gibt sofort Map<K, List<V>> zurück. Was aber, wenn Sie etwas Komplexeres benötigen, z. B. die Anzahl der Elemente in jeder Gruppe zählen? In Java würden Sie Collectors.counting() verwenden:



Map<Integer, Long> countByLength = list.stream()    .collect(Collectors.groupingBy(String::length, Collectors.counting()));


In Kotlin gibt es dafür groupingBy + eachCount:



val countByLength = words.groupingBy { it.length }.eachCount()// Ergebnis: {5=1, 4=1, 6=1, 7=1}


Und wenn Sie statt einer Liste z. B. eine Menge sammeln möchten? Verwenden Sie groupBy mit Transformation:



val byLengthSet = words.groupBy(keySelector = { it.length }, valueTransform = { it.uppercase() })// Ergebnis: {5=[KATZE], 4=[CODE], 6=[KESSEL], 7=[KÄTZCHEN]}


Tipp: Wenn Sie etwas zwischen groupBy und groupingBy benötigen, verwenden Sie groupingBy – es ist lazy und ermöglicht verschiedene Aggregationen (eachCount, fold, reduce).



3. Zeichenkettenverknüpfung: joinToString() statt Collectors.joining()



In Java Zeichenketten mit einem Trennzeichen verknüpfen:



String joined = list.stream()    .collect(Collectors.joining(", "));


In Kotlin geht das noch einfacher:



val words = listOf("Kotlin", "Java", "Python")val joined = words.joinToString(",                

Blogs

Buchempfehlungen