Aggregere Elementer med Reduce()-Metoden
Når du arbeider med samlinger i Java, må du ofte aggregere alle elementene til et enkelt resultat, for eksempel en sum, et produkt eller en annen aggregert verdi.
Det finnes tre varianter av reduce()-metoden, hver tilpasset ulike scenarier. La oss gå gjennom hver av dem i detalj.
reduce() med én parameter
Hvis du trenger å aggregere elementer uten en startverdi, kan du bruke denne versjonen av reduce(). Siden strømmen kan være tom, returnerer metoden en Optional<T>.
Optional<T> reduce(BinaryOperator<T> accumulator);
Denne metoden anvender accumulator-funksjonen på alle elementene i strømmen og returnerer en Optional<T>.
Praktisk eksempel
Tenk deg en nettbutikk med en liste over produkter og deres priser. Målet er å beregne den totale omsetningen for alle produktene i butikken.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738package com.example; import java.util.List; import java.util.Optional; public class Main { public static void main(String[] args) { List<Product> products = List.of( new Product("Laptop", 1200.0), new Product("Mouse", 25.0), new Product("Keyboard", 75.0) ); Optional<Double> totalRevenue = products.stream() .map(Product::getPrice) .reduce(Double::sum); totalRevenue.ifPresent(revenue -> System.out.println("Total revenue: " + revenue)); } } class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } }
Denne koden oppretter en liste med produkter, og bruker deretter reduce() for å summere prisene. Metoden map(Product::getPrice) henter ut prisen til hvert produkt, mens Double::sum utfører summeringen. Hvis resultatet er til stede, blir det skrevet ut.
reduce() med to parametere
Hvis du ønsker å sikre en garantert returverdi, selv når strømmen er tom, bruk reduce()-metoden med en identitetsparameter. Startverdien sikrer en stabil beregning.
T reduce(T identity, BinaryOperator<T> accumulator);
Denne versjonen av reduce() starter med den angitte identity-verdien, noe som sikrer at et resultat alltid returneres, selv for en tom strøm.
Praktisk eksempel
Anta at en butikk har en kasse med en startsaldo, og du må legge til den totale prisen på alle produkter for å finne ut potensiell total kontantbeholdning.
Main.java
12345678910111213141516171819202122232425262728293031323334353637package com.example; import java.util.List; public class Main { public static void main(String[] args) { List<Product> products = List.of( new Product("Laptop", 1200.0), new Product("Mouse", 25.0), new Product("Keyboard", 75.0) ); double totalRevenue = products.stream() .map(Product::getPrice) .reduce(500.0, Double::sum); System.out.println("Total revenue with initial balance: " + totalRevenue); } } class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } }
Her henter koden ut priser med map(Product::getPrice) og bruker reduce(500.0, Double::sum), der 500.0 representerer startsaldoen, og Double::sum summerer verdiene.
reduce() for parallell behandling
Denne versjonen av reduce() er utviklet for tilfeller der det kreves mer komplekse transformasjoner, og resultater må aggregere i parallell.
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
Denne metoden tar tre parametere:
identity– startverdi;accumulator– en funksjon som transformerer hvert element;combiner– en funksjon som slår sammen delresultater.
Praktisk eksempel
I en nettbutikk er det behov for å beregne det totale antallet tegn i alle produktnavn. Dette kan være nyttig for å sette begrensninger på kvitteringslengde.
Main.java
123456789101112131415161718192021222324252627282930313233343536package com.example; import java.util.List; public class Main { public static void main(String[] args) { List<Product> products = List.of( new Product("Laptop", 1200.0), new Product("Mouse", 25.0), new Product("Keyboard", 75.0) ); int totalLength = products.stream() .reduce(0, (sum, product) -> sum + product.getName().length(), Integer::sum); System.out.println("Total name length: " + totalLength); } } class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } }
Koden itererer gjennom listen av produkter ved bruk av reduce(), der 0 er initialverdien, (sum, product) -> sum + product.getName().length() definerer logikken for summering av lengdene på produktnavnene, og Integer::sum kombinerer resultatene i et parallelt prosesseringsmiljø.
1. Hvilken datatype returnerer reduce(BinaryOperator<T> accumulator) hvis strømmen kan være tom?
2. Når bør du bruke reduce(T identity, BinaryOperator<T> accumulator)?
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
Aggregere Elementer med Reduce()-Metoden
Sveip for å vise menyen
Når du arbeider med samlinger i Java, må du ofte aggregere alle elementene til et enkelt resultat, for eksempel en sum, et produkt eller en annen aggregert verdi.
Det finnes tre varianter av reduce()-metoden, hver tilpasset ulike scenarier. La oss gå gjennom hver av dem i detalj.
reduce() med én parameter
Hvis du trenger å aggregere elementer uten en startverdi, kan du bruke denne versjonen av reduce(). Siden strømmen kan være tom, returnerer metoden en Optional<T>.
Optional<T> reduce(BinaryOperator<T> accumulator);
Denne metoden anvender accumulator-funksjonen på alle elementene i strømmen og returnerer en Optional<T>.
Praktisk eksempel
Tenk deg en nettbutikk med en liste over produkter og deres priser. Målet er å beregne den totale omsetningen for alle produktene i butikken.
Main.java
1234567891011121314151617181920212223242526272829303132333435363738package com.example; import java.util.List; import java.util.Optional; public class Main { public static void main(String[] args) { List<Product> products = List.of( new Product("Laptop", 1200.0), new Product("Mouse", 25.0), new Product("Keyboard", 75.0) ); Optional<Double> totalRevenue = products.stream() .map(Product::getPrice) .reduce(Double::sum); totalRevenue.ifPresent(revenue -> System.out.println("Total revenue: " + revenue)); } } class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } }
Denne koden oppretter en liste med produkter, og bruker deretter reduce() for å summere prisene. Metoden map(Product::getPrice) henter ut prisen til hvert produkt, mens Double::sum utfører summeringen. Hvis resultatet er til stede, blir det skrevet ut.
reduce() med to parametere
Hvis du ønsker å sikre en garantert returverdi, selv når strømmen er tom, bruk reduce()-metoden med en identitetsparameter. Startverdien sikrer en stabil beregning.
T reduce(T identity, BinaryOperator<T> accumulator);
Denne versjonen av reduce() starter med den angitte identity-verdien, noe som sikrer at et resultat alltid returneres, selv for en tom strøm.
Praktisk eksempel
Anta at en butikk har en kasse med en startsaldo, og du må legge til den totale prisen på alle produkter for å finne ut potensiell total kontantbeholdning.
Main.java
12345678910111213141516171819202122232425262728293031323334353637package com.example; import java.util.List; public class Main { public static void main(String[] args) { List<Product> products = List.of( new Product("Laptop", 1200.0), new Product("Mouse", 25.0), new Product("Keyboard", 75.0) ); double totalRevenue = products.stream() .map(Product::getPrice) .reduce(500.0, Double::sum); System.out.println("Total revenue with initial balance: " + totalRevenue); } } class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } }
Her henter koden ut priser med map(Product::getPrice) og bruker reduce(500.0, Double::sum), der 500.0 representerer startsaldoen, og Double::sum summerer verdiene.
reduce() for parallell behandling
Denne versjonen av reduce() er utviklet for tilfeller der det kreves mer komplekse transformasjoner, og resultater må aggregere i parallell.
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
Denne metoden tar tre parametere:
identity– startverdi;accumulator– en funksjon som transformerer hvert element;combiner– en funksjon som slår sammen delresultater.
Praktisk eksempel
I en nettbutikk er det behov for å beregne det totale antallet tegn i alle produktnavn. Dette kan være nyttig for å sette begrensninger på kvitteringslengde.
Main.java
123456789101112131415161718192021222324252627282930313233343536package com.example; import java.util.List; public class Main { public static void main(String[] args) { List<Product> products = List.of( new Product("Laptop", 1200.0), new Product("Mouse", 25.0), new Product("Keyboard", 75.0) ); int totalLength = products.stream() .reduce(0, (sum, product) -> sum + product.getName().length(), Integer::sum); System.out.println("Total name length: " + totalLength); } } class Product { private String name; private double price; public Product(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } }
Koden itererer gjennom listen av produkter ved bruk av reduce(), der 0 er initialverdien, (sum, product) -> sum + product.getName().length() definerer logikken for summering av lengdene på produktnavnene, og Integer::sum kombinerer resultatene i et parallelt prosesseringsmiljø.
1. Hvilken datatype returnerer reduce(BinaryOperator<T> accumulator) hvis strømmen kan være tom?
2. Når bør du bruke reduce(T identity, BinaryOperator<T> accumulator)?
Takk for tilbakemeldingene dine!