Collectors Hjælpeklasse til Stream API
Metoden collect() i Stream API er allerede kendt som et kraftfuldt værktøj til at samle elementer fra en stream i praktiske datastrukturer. Dog kræver collect() selv en Collector-implementering, hvilket kan gøre processen mere kompleks.
Her er Collectors-klassen nyttig, da den tilbyder et sæt foruddefinerede implementeringer til de mest almindelige operationer. Den forenkler opgaver som at samle data i samlinger, gruppering og optælling, hvilket gør disse operationer langt mere ligetil.
Centrale metoder i Collectors-klassen
Collectors-klassen tilbyder adskillige færdige løsninger, så det ikke er nødvendigt manuelt at implementere en Collector. Her er nogle af de vigtigste metoder:
Stream API tilbyder også den indbyggede metode toList(), som du har brugt før. Denne metode har en kortfattet syntaks, hvilket gør den til vores foretrukne valg. Du er dog fri til at anvende enhver implementering, der passer bedst til dine behov.
Konvertering af en liste til et map
Antag, at du har en liste af produkter med deres priser, gemt som strenge i formatet Name=Price. Målet er at oprette et Map, hvor nøglen er produktnavnet og værdien er dets pris.
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); } }
Her bruges toMap() til at opdele hver streng (split("=")) og oprette et Map<String, Integer>, hvor nøglen er produktnavnet og værdien er dets pris som et heltal. For eksempel omdannes strengen Laptop=1500 til en post Laptop -> 1500.
Gruppering af produkter efter første bogstav
Lad os gruppere produkter efter deres første bogstav for at se, hvilke varer der starter med det samme bogstav.
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); } }
Programmet opretter en List med produktnavne og grupperer dem efter deres første bogstav ved hjælp af groupingBy(). Resultatet gemmes i et Map, hvor nøglen er charAt(0), og værdien er en liste af tilsvarende produkter. Til sidst udskrives de grupperede produkter.
Opdeling af priser
Collectors.partitioningBy er en speciel collector i Stream API, der opdeler elementer i to grupper baseret på et givet predikat.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Den returnerer et Map<Boolean, List<T>>, hvor true repræsenterer elementer, der opfylder betingelsen, og false repræsenterer dem, der ikke gør.
Dette er nyttigt til adskillelse af data, såsom filtrering af lige og ulige tal eller dyre og billige produkter.
Eksempel
Lad os opdele produktpriser i to kategorier: dyre (større end $1000) og billige ($1000 eller mindre).
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)); } }
Metoden partitioningBy() deler prisliste op i to grupper. Hvis en pris er større end 1000, placeres den under nøglen true; ellers placeres den under false.
Optælling af produkter
Lad os tælle, hvor mange produkter der starter med det samme bogstav.
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); } }
Programmet behandler List af produkter ved hjælp af stream(), anvender derefter groupingBy() med charAt(0) for at gruppere ord efter deres første bogstav. counting()-samleren tæller, hvor mange produkter der falder i hver gruppe, og den endelige Map gemmer bogstavet som en nøgle og antallet som en værdi.
Sammenkædning af produktnavne
Lad os sammenkæde produktnavne til en enkelt streng, adskilt med kommaer.
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); } }
Collectors.joining(", ")-metoden sammenkæder alle produktnavne til en enkelt streng, adskilt med kommaer. Til sidst udskrives den resulterende streng for at vise produktlisten i et læsbart format.
1. Hvad gør følgende kode?
2. Hvilken Collectors-metode skal bruges til at gruppere produkter efter deres første bogstav?
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
Can you show examples of how to use each Collectors method?
What are some common use cases for groupingBy and partitioningBy?
How do I choose between toList(), toSet(), and toMap()?
Awesome!
Completion rate improved to 2.33
Collectors Hjælpeklasse til Stream API
Stryg for at vise menuen
Metoden collect() i Stream API er allerede kendt som et kraftfuldt værktøj til at samle elementer fra en stream i praktiske datastrukturer. Dog kræver collect() selv en Collector-implementering, hvilket kan gøre processen mere kompleks.
Her er Collectors-klassen nyttig, da den tilbyder et sæt foruddefinerede implementeringer til de mest almindelige operationer. Den forenkler opgaver som at samle data i samlinger, gruppering og optælling, hvilket gør disse operationer langt mere ligetil.
Centrale metoder i Collectors-klassen
Collectors-klassen tilbyder adskillige færdige løsninger, så det ikke er nødvendigt manuelt at implementere en Collector. Her er nogle af de vigtigste metoder:
Stream API tilbyder også den indbyggede metode toList(), som du har brugt før. Denne metode har en kortfattet syntaks, hvilket gør den til vores foretrukne valg. Du er dog fri til at anvende enhver implementering, der passer bedst til dine behov.
Konvertering af en liste til et map
Antag, at du har en liste af produkter med deres priser, gemt som strenge i formatet Name=Price. Målet er at oprette et Map, hvor nøglen er produktnavnet og værdien er dets pris.
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); } }
Her bruges toMap() til at opdele hver streng (split("=")) og oprette et Map<String, Integer>, hvor nøglen er produktnavnet og værdien er dets pris som et heltal. For eksempel omdannes strengen Laptop=1500 til en post Laptop -> 1500.
Gruppering af produkter efter første bogstav
Lad os gruppere produkter efter deres første bogstav for at se, hvilke varer der starter med det samme bogstav.
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); } }
Programmet opretter en List med produktnavne og grupperer dem efter deres første bogstav ved hjælp af groupingBy(). Resultatet gemmes i et Map, hvor nøglen er charAt(0), og værdien er en liste af tilsvarende produkter. Til sidst udskrives de grupperede produkter.
Opdeling af priser
Collectors.partitioningBy er en speciel collector i Stream API, der opdeler elementer i to grupper baseret på et givet predikat.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Den returnerer et Map<Boolean, List<T>>, hvor true repræsenterer elementer, der opfylder betingelsen, og false repræsenterer dem, der ikke gør.
Dette er nyttigt til adskillelse af data, såsom filtrering af lige og ulige tal eller dyre og billige produkter.
Eksempel
Lad os opdele produktpriser i to kategorier: dyre (større end $1000) og billige ($1000 eller mindre).
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)); } }
Metoden partitioningBy() deler prisliste op i to grupper. Hvis en pris er større end 1000, placeres den under nøglen true; ellers placeres den under false.
Optælling af produkter
Lad os tælle, hvor mange produkter der starter med det samme bogstav.
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); } }
Programmet behandler List af produkter ved hjælp af stream(), anvender derefter groupingBy() med charAt(0) for at gruppere ord efter deres første bogstav. counting()-samleren tæller, hvor mange produkter der falder i hver gruppe, og den endelige Map gemmer bogstavet som en nøgle og antallet som en værdi.
Sammenkædning af produktnavne
Lad os sammenkæde produktnavne til en enkelt streng, adskilt med kommaer.
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); } }
Collectors.joining(", ")-metoden sammenkæder alle produktnavne til en enkelt streng, adskilt med kommaer. Til sidst udskrives den resulterende streng for at vise produktlisten i et læsbart format.
1. Hvad gør følgende kode?
2. Hvilken Collectors-metode skal bruges til at gruppere produkter efter deres første bogstav?
Tak for dine kommentarer!