Collectors-verktygsklass för Stream API
Metoden collect() i Stream API är redan bekant som ett kraftfullt verktyg för att samla strömelement i praktiska datastrukturer. Dock kräver collect() i sig en Collector-implementation, vilket kan göra processen mer komplex.
Här är Collectors-klassen användbar, då den tillhandahåller en uppsättning färdigbyggda implementationer för de vanligaste operationerna. Den förenklar uppgifter som att samla data i samlingar, gruppering och räkning, vilket gör dessa operationer betydligt enklare.
Viktiga metoder i Collectors-klassen
Collectors-klassen erbjuder många färdiga lösningar, vilket eliminerar behovet av att manuellt implementera en Collector. Här är några av de huvudsakliga metoderna:
Stream API erbjuder även den inbyggda metoden toList(), som du har använt tidigare. Denna metod har en koncis syntax och är vårt förstahandsval. Du kan dock använda valfri implementation som bäst passar dina behov.
Konvertera en lista till en Map
Anta att du har en lista med produkter och deras priser, lagrade som strängar i formatet Name=Price. Målet är att skapa en Map där nyckeln är produktnamnet och värdet är dess 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); } }
Här används toMap() för att dela upp varje sträng (split("=")) och skapa en Map<String, Integer>, där nyckeln är produktnamnet och värdet är dess pris som ett heltal. Till exempel omvandlas strängen Laptop=1500 till posten Laptop -> 1500.
Gruppera produkter efter första bokstaven
Här grupperas produkter efter deras första bokstav för att visa vilka varor som börjar med samma bokstav.
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 skapar en List med produktnamn och grupperar dem efter deras första bokstav med hjälp av groupingBy(). Resultatet lagras i en Map, där nyckeln är charAt(0) och värdet är en lista med matchande produkter. Slutligen skrivs de grupperade produkterna ut.
Uppdelning av priser
Collectors.partitioningBy är en speciell collector i Stream API som delar upp element i två grupper baserat på ett givet predikat.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Den returnerar en Map<Boolean, List<T>>, där true representerar element som uppfyller villkoret, och false representerar de som inte gör det.
Detta är användbart för separering av data, såsom filtrering av jämna och udda tal eller produkter med höga och låga priser.
Exempel
Låt oss dela upp produktpriser i två kategorier: dyra (över $1000) och billiga ($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() delar upp prislistan i två grupper. Om ett pris är större än 1000 placeras det under nyckeln true; annars hamnar det under false.
Räkna produkter
Räkna hur många produkter som börjar med samma bokstav.
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 bearbetar List av produkter med hjälp av stream(), tillämpar sedan groupingBy() med charAt(0) för att gruppera ord efter deras första bokstav. counting()-uppsamlaren räknar hur många produkter som hamnar i varje grupp, och den slutliga Map lagrar bokstaven som nyckel och antalet som värde.
Sammanfogning av produktnamn
Sammanfoga produktnamn till en enda sträng, separerade med kommatecken.
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); } }
Metoden Collectors.joining(", ") konkatenerar alla produktnamn till en enda sträng, separerade med kommatecken. Slutligen skrivs den resulterande strängen ut för att visa produktlistan i ett läsbart format.
1. Vad gör följande kod?
2. Vilken Collectors-metod ska användas för att gruppera produkter efter deras första bokstav?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 2.33
Collectors-verktygsklass för Stream API
Svep för att visa menyn
Metoden collect() i Stream API är redan bekant som ett kraftfullt verktyg för att samla strömelement i praktiska datastrukturer. Dock kräver collect() i sig en Collector-implementation, vilket kan göra processen mer komplex.
Här är Collectors-klassen användbar, då den tillhandahåller en uppsättning färdigbyggda implementationer för de vanligaste operationerna. Den förenklar uppgifter som att samla data i samlingar, gruppering och räkning, vilket gör dessa operationer betydligt enklare.
Viktiga metoder i Collectors-klassen
Collectors-klassen erbjuder många färdiga lösningar, vilket eliminerar behovet av att manuellt implementera en Collector. Här är några av de huvudsakliga metoderna:
Stream API erbjuder även den inbyggda metoden toList(), som du har använt tidigare. Denna metod har en koncis syntax och är vårt förstahandsval. Du kan dock använda valfri implementation som bäst passar dina behov.
Konvertera en lista till en Map
Anta att du har en lista med produkter och deras priser, lagrade som strängar i formatet Name=Price. Målet är att skapa en Map där nyckeln är produktnamnet och värdet är dess 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); } }
Här används toMap() för att dela upp varje sträng (split("=")) och skapa en Map<String, Integer>, där nyckeln är produktnamnet och värdet är dess pris som ett heltal. Till exempel omvandlas strängen Laptop=1500 till posten Laptop -> 1500.
Gruppera produkter efter första bokstaven
Här grupperas produkter efter deras första bokstav för att visa vilka varor som börjar med samma bokstav.
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 skapar en List med produktnamn och grupperar dem efter deras första bokstav med hjälp av groupingBy(). Resultatet lagras i en Map, där nyckeln är charAt(0) och värdet är en lista med matchande produkter. Slutligen skrivs de grupperade produkterna ut.
Uppdelning av priser
Collectors.partitioningBy är en speciell collector i Stream API som delar upp element i två grupper baserat på ett givet predikat.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Den returnerar en Map<Boolean, List<T>>, där true representerar element som uppfyller villkoret, och false representerar de som inte gör det.
Detta är användbart för separering av data, såsom filtrering av jämna och udda tal eller produkter med höga och låga priser.
Exempel
Låt oss dela upp produktpriser i två kategorier: dyra (över $1000) och billiga ($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() delar upp prislistan i två grupper. Om ett pris är större än 1000 placeras det under nyckeln true; annars hamnar det under false.
Räkna produkter
Räkna hur många produkter som börjar med samma bokstav.
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 bearbetar List av produkter med hjälp av stream(), tillämpar sedan groupingBy() med charAt(0) för att gruppera ord efter deras första bokstav. counting()-uppsamlaren räknar hur många produkter som hamnar i varje grupp, och den slutliga Map lagrar bokstaven som nyckel och antalet som värde.
Sammanfogning av produktnamn
Sammanfoga produktnamn till en enda sträng, separerade med kommatecken.
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); } }
Metoden Collectors.joining(", ") konkatenerar alla produktnamn till en enda sträng, separerade med kommatecken. Slutligen skrivs den resulterande strängen ut för att visa produktlistan i ett läsbart format.
1. Vad gör följande kod?
2. Vilken Collectors-metod ska användas för att gruppera produkter efter deras första bokstav?
Tack för dina kommentarer!