Collectors-verktøyklasse for Stream API
Metoden collect() i Stream API er allerede kjent som et kraftig verktøy for å samle elementer fra en strøm i praktiske datastrukturer. Likevel krever collect() en Collector-implementasjon, noe som kan gjøre prosessen mer kompleks.
Her kommer klassen Collectors til nytte, ved å tilby et sett med ferdiglagde implementasjoner for de vanligste operasjonene. Dette forenkler oppgaver som å samle data i samlinger, gruppering og telling, og gjør slike operasjoner langt mer oversiktlige.
Viktige metoder i Collectors-klassen
Klassen Collectors tilbyr en rekke ferdige løsninger, slik at man slipper å implementere en Collector manuelt. Her er noen av de viktigste metodene:
Stream API tilbyr også den innebygde metoden toList(), som du har brukt tidligere. Denne metoden har en kortfattet syntaks, og er vårt foretrukne valg. Du står likevel fritt til å bruke den implementasjonen som passer best til ditt behov.
Konvertere en liste til et kart
Anta at du har en liste med produkter og deres priser, lagret som strenger i formatet Name=Price. Målet er å opprette et Map der nøkkelen er produktnavnet og verdien er prisen.
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 brukes toMap() for å dele opp hver streng (split("=")) og opprette et Map<String, Integer>, der nøkkelen er produktnavnet og verdien er prisen som et heltall. For eksempel blir strengen Laptop=1500 til oppføringen Laptop -> 1500.
Gruppering av produkter etter første bokstav
La oss gruppere produkter etter første bokstav for å se hvilke varer som starter med samme 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 oppretter en List med produktnavn og grupperer dem etter første bokstav ved hjelp av groupingBy(). Resultatet lagres i en Map, hvor nøkkelen er charAt(0), og verdien er en liste over samsvarende produkter. Til slutt skrives de grupperte produktene ut.
Oppdeling av priser
Collectors.partitioningBy er en spesiell collector i Stream API som deler elementer inn i to grupper basert på et gitt predikat.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Den returnerer en Map<Boolean, List<T>>, hvor true representerer elementer som oppfyller betingelsen, og false representerer de som ikke gjør det.
Dette er nyttig for å separere data, som for eksempel å filtrere partall og oddetall eller dyre og rimelige produkter.
Eksempel
Vi skal dele opp produktpriser i to kategorier: dyre (større enn $1000) og rimelige ($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 prislisten i to grupper. Hvis en pris er større enn 1000, plasseres den under nøkkelen true; ellers havner den under false.
Telling av produkter
La oss telle hvor mange produkter som begynner med samme 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 behandler List av produkter ved å bruke stream(), deretter anvendes groupingBy() med charAt(0) for å gruppere ordene etter første bokstav. counting()-samleren teller hvor mange produkter som havner i hver gruppe, og den endelige Map lagrer bokstaven som nøkkel og antallet som verdi.
Sammenføying av produktnavn
Sammenkobling av produktnavn til én streng, adskilt med komma.
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 slår sammen alle produktnavn til en enkelt streng, adskilt med kommaer. Til slutt blir den resulterende strengen skrevet ut for å vise produktlisten i et lesbart format.
1. Hva gjør følgende kode?
2. Hvilken Collectors-metode bør brukes for å gruppere produkter etter første bokstav?
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Awesome!
Completion rate improved to 2.33
Collectors-verktøyklasse for Stream API
Sveip for å vise menyen
Metoden collect() i Stream API er allerede kjent som et kraftig verktøy for å samle elementer fra en strøm i praktiske datastrukturer. Likevel krever collect() en Collector-implementasjon, noe som kan gjøre prosessen mer kompleks.
Her kommer klassen Collectors til nytte, ved å tilby et sett med ferdiglagde implementasjoner for de vanligste operasjonene. Dette forenkler oppgaver som å samle data i samlinger, gruppering og telling, og gjør slike operasjoner langt mer oversiktlige.
Viktige metoder i Collectors-klassen
Klassen Collectors tilbyr en rekke ferdige løsninger, slik at man slipper å implementere en Collector manuelt. Her er noen av de viktigste metodene:
Stream API tilbyr også den innebygde metoden toList(), som du har brukt tidligere. Denne metoden har en kortfattet syntaks, og er vårt foretrukne valg. Du står likevel fritt til å bruke den implementasjonen som passer best til ditt behov.
Konvertere en liste til et kart
Anta at du har en liste med produkter og deres priser, lagret som strenger i formatet Name=Price. Målet er å opprette et Map der nøkkelen er produktnavnet og verdien er prisen.
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 brukes toMap() for å dele opp hver streng (split("=")) og opprette et Map<String, Integer>, der nøkkelen er produktnavnet og verdien er prisen som et heltall. For eksempel blir strengen Laptop=1500 til oppføringen Laptop -> 1500.
Gruppering av produkter etter første bokstav
La oss gruppere produkter etter første bokstav for å se hvilke varer som starter med samme 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 oppretter en List med produktnavn og grupperer dem etter første bokstav ved hjelp av groupingBy(). Resultatet lagres i en Map, hvor nøkkelen er charAt(0), og verdien er en liste over samsvarende produkter. Til slutt skrives de grupperte produktene ut.
Oppdeling av priser
Collectors.partitioningBy er en spesiell collector i Stream API som deler elementer inn i to grupper basert på et gitt predikat.
Map<Boolean, List<Integer>> partitionedPrices = prices.stream()
.collect(Collectors.partitioningBy(price -> price > 1000));
Den returnerer en Map<Boolean, List<T>>, hvor true representerer elementer som oppfyller betingelsen, og false representerer de som ikke gjør det.
Dette er nyttig for å separere data, som for eksempel å filtrere partall og oddetall eller dyre og rimelige produkter.
Eksempel
Vi skal dele opp produktpriser i to kategorier: dyre (større enn $1000) og rimelige ($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 prislisten i to grupper. Hvis en pris er større enn 1000, plasseres den under nøkkelen true; ellers havner den under false.
Telling av produkter
La oss telle hvor mange produkter som begynner med samme 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 behandler List av produkter ved å bruke stream(), deretter anvendes groupingBy() med charAt(0) for å gruppere ordene etter første bokstav. counting()-samleren teller hvor mange produkter som havner i hver gruppe, og den endelige Map lagrer bokstaven som nøkkel og antallet som verdi.
Sammenføying av produktnavn
Sammenkobling av produktnavn til én streng, adskilt med komma.
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 slår sammen alle produktnavn til en enkelt streng, adskilt med kommaer. Til slutt blir den resulterende strengen skrevet ut for å vise produktlisten i et lesbart format.
1. Hva gjør følgende kode?
2. Hvilken Collectors-metode bør brukes for å gruppere produkter etter første bokstav?
Takk for tilbakemeldingene dine!