Collectors-Hilfsklasse Für Die Stream-API
Die collect()-Methode im Stream API ist bereits als leistungsfähiges Werkzeug zum Sammeln von Stream-Elementen in praktische Datenstrukturen bekannt. Allerdings erfordert collect() selbst eine Collector-Implementierung, was den Prozess komplexer machen kann.
Hier kommt die Collectors-Klasse ins Spiel, die eine Reihe von vorgefertigten Implementierungen für die gängigsten Operationen bereitstellt. Sie vereinfacht Aufgaben wie das Sammeln von Daten in Collections, Gruppierungen und Zählungen und macht diese Operationen deutlich unkomplizierter.
Wichtige Methoden der Collectors-Klasse
Die Collectors-Klasse bietet zahlreiche fertige Lösungen, sodass eine manuelle Implementierung eines Collector nicht mehr notwendig ist. Hier sind einige der wichtigsten Methoden:
Das Stream API bietet außerdem die eingebaute Methode toList(), die bereits verwendet wurde. Diese Methode zeichnet sich durch eine knappe Syntax aus und ist daher die bevorzugte Wahl. Es steht jedoch frei, jede Implementierung zu nutzen, die den eigenen Anforderungen am besten entspricht.
Umwandlung einer Liste in eine Map
Angenommen, es liegt eine Liste von Produkten mit ihren Preisen vor, gespeichert als Zeichenketten im Format Name=Price. Ziel ist es, eine Map zu erstellen, bei der der Schlüssel der Produktname und der Wert dessen Preis ist.
Main.java
1234567891011121314151617181920package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> productData = List.of("Laptop:1500", "Smartphone:900", "Monitor:1200"); // Convert the list of strings into a `Map` by splitting the string at "=" Map<String, Integer> productPriceMap = productData.stream() .collect(Collectors.toMap( item -> item.split(":")[0], // Key - product name item -> Integer.parseInt(item.split(":")[1]) // Value - price )); System.out.println("Product Map: " + productPriceMap); } }
Hier wird toMap() verwendet, um jede Zeichenkette (split("=")) zu trennen und eine Map<String, Integer> zu erzeugen, wobei der Schlüssel der Produktname und der Wert dessen Preis als Integer ist. Beispielsweise wird die Zeichenkette Laptop=1500 in den Eintrag Laptop -> 1500 umgewandelt.
Gruppierung von Produkten nach dem Anfangsbuchstaben
Produkte werden nach ihrem Anfangsbuchstaben gruppiert, um zu erkennen, welche Artikel mit demselben Buchstaben beginnen.
Main.java
12345678910111213141516171819202122package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Drone", "Smartphone", "Smartwatch", "Monitor", "Mouse" ); // Grouping products by the first letter of their name Map<Character, List<String>> groupedProducts = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0))); System.out.println("Products grouped by first letter: " + groupedProducts); } }
Das Programm erstellt eine List mit Produktnamen und gruppiert diese anhand ihres Anfangsbuchstabens mit groupingBy(). Das Ergebnis wird in einer Map gespeichert, wobei der Schlüssel charAt(0) ist und der Wert eine Liste der entsprechenden Produkte darstellt. Abschließend werden die gruppierten Produkte ausgegeben.
Aufteilung von Preisen
Collectors.partitioningBy ist ein spezieller Collector in der Stream-API, der Elemente anhand eines angegebenen Prädikats in zwei Gruppen aufteilt.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Es wird eine Map<Boolean, List<T>> zurückgegeben, wobei true für Elemente steht, die die Bedingung erfüllen, und false für diejenigen, die sie nicht erfüllen.
Dies ist nützlich zur Trennung von Daten, beispielsweise beim Filtern von geraden und ungeraden Zahlen oder hoch- und niedrigpreisigen Produkten.
Beispiel
Hier werden Produktpreise in zwei Kategorien unterteilt: teuer (größer als $1000) und günstig ($1000 oder weniger).
Main.java
123456789101112131415161718package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> prices = List.of(1500, 900, 1200, 1100, 300); // Partition prices into expensive and cheap categories Map<Boolean, List<Integer>> partitionedPrices = prices.stream() .collect(Collectors.partitioningBy(price -> price > 1000)); System.out.println("Expensive products: " + partitionedPrices.get(true)); System.out.print("Cheap products: " + partitionedPrices.get(false)); } }
Die Methode partitioningBy() teilt die Preisliste in zwei Gruppen. Ist ein Preis größer als 1000, wird er unter dem Schlüssel true abgelegt; andernfalls unter false.
Produkte zählen
Anzahl der Produkte, die mit demselben Buchstaben beginnen.
Main.java
12345678910111213141516171819202122package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Dishwasher", "Drone", "Smartphone", "Smartwatch", "Speaker", "Monitor", "Mouse", "Microphone" ); // Count how many products start with each letter Map<Character, Long> countByLetter = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0), Collectors.counting())); System.out.println("Product count by first letter: " + countByLetter); } }
Das Programm verarbeitet die List der Produkte mit stream(), wendet dann groupingBy() mit charAt(0) an, um Wörter nach ihrem ersten Buchstaben zu gruppieren. Der counting() Collector zählt, wie viele Produkte in jede Gruppe fallen, und die abschließende Map speichert den Buchstaben als Schlüssel und die Anzahl als Wert.
Produktnamen zusammenfügen
Die Produktnamen werden zu einem einzelnen String zusammengefügt und mit Kommas getrennt.
Main.java
12345678910111213141516package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of("Laptop", "Smartphone", "Monitor"); // Join product names into a single comma-separated string String productNames = products.stream() .collect(Collectors.joining(", ")); System.out.println("Product list: " + productNames); } }
Die Methode Collectors.joining(", ") verkettet alle Produktnamen zu einem einzigen String und trennt sie durch Kommas. Abschließend wird der resultierende String ausgegeben, um die Produktliste in einem lesbaren Format darzustellen.
1. Was macht der folgende Code?
2. Welche Collectors-Methode sollte verwendet werden, um Produkte nach ihrem Anfangsbuchstaben zu gruppieren?
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Awesome!
Completion rate improved to 2.33
Collectors-Hilfsklasse Für Die Stream-API
Swipe um das Menü anzuzeigen
Die collect()-Methode im Stream API ist bereits als leistungsfähiges Werkzeug zum Sammeln von Stream-Elementen in praktische Datenstrukturen bekannt. Allerdings erfordert collect() selbst eine Collector-Implementierung, was den Prozess komplexer machen kann.
Hier kommt die Collectors-Klasse ins Spiel, die eine Reihe von vorgefertigten Implementierungen für die gängigsten Operationen bereitstellt. Sie vereinfacht Aufgaben wie das Sammeln von Daten in Collections, Gruppierungen und Zählungen und macht diese Operationen deutlich unkomplizierter.
Wichtige Methoden der Collectors-Klasse
Die Collectors-Klasse bietet zahlreiche fertige Lösungen, sodass eine manuelle Implementierung eines Collector nicht mehr notwendig ist. Hier sind einige der wichtigsten Methoden:
Das Stream API bietet außerdem die eingebaute Methode toList(), die bereits verwendet wurde. Diese Methode zeichnet sich durch eine knappe Syntax aus und ist daher die bevorzugte Wahl. Es steht jedoch frei, jede Implementierung zu nutzen, die den eigenen Anforderungen am besten entspricht.
Umwandlung einer Liste in eine Map
Angenommen, es liegt eine Liste von Produkten mit ihren Preisen vor, gespeichert als Zeichenketten im Format Name=Price. Ziel ist es, eine Map zu erstellen, bei der der Schlüssel der Produktname und der Wert dessen Preis ist.
Main.java
1234567891011121314151617181920package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> productData = List.of("Laptop:1500", "Smartphone:900", "Monitor:1200"); // Convert the list of strings into a `Map` by splitting the string at "=" Map<String, Integer> productPriceMap = productData.stream() .collect(Collectors.toMap( item -> item.split(":")[0], // Key - product name item -> Integer.parseInt(item.split(":")[1]) // Value - price )); System.out.println("Product Map: " + productPriceMap); } }
Hier wird toMap() verwendet, um jede Zeichenkette (split("=")) zu trennen und eine Map<String, Integer> zu erzeugen, wobei der Schlüssel der Produktname und der Wert dessen Preis als Integer ist. Beispielsweise wird die Zeichenkette Laptop=1500 in den Eintrag Laptop -> 1500 umgewandelt.
Gruppierung von Produkten nach dem Anfangsbuchstaben
Produkte werden nach ihrem Anfangsbuchstaben gruppiert, um zu erkennen, welche Artikel mit demselben Buchstaben beginnen.
Main.java
12345678910111213141516171819202122package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Drone", "Smartphone", "Smartwatch", "Monitor", "Mouse" ); // Grouping products by the first letter of their name Map<Character, List<String>> groupedProducts = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0))); System.out.println("Products grouped by first letter: " + groupedProducts); } }
Das Programm erstellt eine List mit Produktnamen und gruppiert diese anhand ihres Anfangsbuchstabens mit groupingBy(). Das Ergebnis wird in einer Map gespeichert, wobei der Schlüssel charAt(0) ist und der Wert eine Liste der entsprechenden Produkte darstellt. Abschließend werden die gruppierten Produkte ausgegeben.
Aufteilung von Preisen
Collectors.partitioningBy ist ein spezieller Collector in der Stream-API, der Elemente anhand eines angegebenen Prädikats in zwei Gruppen aufteilt.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Es wird eine Map<Boolean, List<T>> zurückgegeben, wobei true für Elemente steht, die die Bedingung erfüllen, und false für diejenigen, die sie nicht erfüllen.
Dies ist nützlich zur Trennung von Daten, beispielsweise beim Filtern von geraden und ungeraden Zahlen oder hoch- und niedrigpreisigen Produkten.
Beispiel
Hier werden Produktpreise in zwei Kategorien unterteilt: teuer (größer als $1000) und günstig ($1000 oder weniger).
Main.java
123456789101112131415161718package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<Integer> prices = List.of(1500, 900, 1200, 1100, 300); // Partition prices into expensive and cheap categories Map<Boolean, List<Integer>> partitionedPrices = prices.stream() .collect(Collectors.partitioningBy(price -> price > 1000)); System.out.println("Expensive products: " + partitionedPrices.get(true)); System.out.print("Cheap products: " + partitionedPrices.get(false)); } }
Die Methode partitioningBy() teilt die Preisliste in zwei Gruppen. Ist ein Preis größer als 1000, wird er unter dem Schlüssel true abgelegt; andernfalls unter false.
Produkte zählen
Anzahl der Produkte, die mit demselben Buchstaben beginnen.
Main.java
12345678910111213141516171819202122package com.example; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of( "Laptop", "Lamp", "Laser Printer", "Desktop PC", "Dishwasher", "Drone", "Smartphone", "Smartwatch", "Speaker", "Monitor", "Mouse", "Microphone" ); // Count how many products start with each letter Map<Character, Long> countByLetter = products.stream() .collect(Collectors.groupingBy(product -> product.charAt(0), Collectors.counting())); System.out.println("Product count by first letter: " + countByLetter); } }
Das Programm verarbeitet die List der Produkte mit stream(), wendet dann groupingBy() mit charAt(0) an, um Wörter nach ihrem ersten Buchstaben zu gruppieren. Der counting() Collector zählt, wie viele Produkte in jede Gruppe fallen, und die abschließende Map speichert den Buchstaben als Schlüssel und die Anzahl als Wert.
Produktnamen zusammenfügen
Die Produktnamen werden zu einem einzelnen String zusammengefügt und mit Kommas getrennt.
Main.java
12345678910111213141516package com.example; import java.util.List; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { List<String> products = List.of("Laptop", "Smartphone", "Monitor"); // Join product names into a single comma-separated string String productNames = products.stream() .collect(Collectors.joining(", ")); System.out.println("Product list: " + productNames); } }
Die Methode Collectors.joining(", ") verkettet alle Produktnamen zu einem einzigen String und trennt sie durch Kommas. Abschließend wird der resultierende String ausgegeben, um die Produktliste in einem lesbaren Format darzustellen.
1. Was macht der folgende Code?
2. Welche Collectors-Methode sollte verwendet werden, um Produkte nach ihrem Anfangsbuchstaben zu gruppieren?
Danke für Ihr Feedback!