Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Collectors-verktygsklass för Stream API | Terminaloperationer i Stream API
Stream API

bookCollectors-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

Main.java

copy
1234567891011121314151617181920
package 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

Main.java

copy
12345678910111213141516171819202122
package 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

Main.java

copy
123456789101112131415161718
package 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

Main.java

copy
12345678910111213141516171819202122
package 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

Main.java

copy
12345678910111213141516
package 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?

question mark

Vad gör följande kod?

Select the correct answer

question mark

Vilken Collectors-metod ska användas för att gruppera produkter efter deras första bokstav?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 3

Fråga AI

expand

Fråga AI

ChatGPT

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

bookCollectors-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

Main.java

copy
1234567891011121314151617181920
package 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

Main.java

copy
12345678910111213141516171819202122
package 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

Main.java

copy
123456789101112131415161718
package 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

Main.java

copy
12345678910111213141516171819202122
package 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

Main.java

copy
12345678910111213141516
package 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?

question mark

Vad gör följande kod?

Select the correct answer

question mark

Vilken Collectors-metod ska användas för att gruppera produkter efter deras första bokstav?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 3
some-alt