Aggregering af Elementer med Reduce()-Metoden
Ved arbejde med collections i Java er det ofte nødvendigt at reducere alle elementer til et enkelt resultat, såsom en sum, et produkt eller en anden aggregeret værdi.
Der findes tre varianter af reduce()-metoden, som hver især er designet til forskellige scenarier. Her gennemgås hver enkelt i detalje.
reduce() med én parameter
Hvis det er nødvendigt at aggregere elementer uden en initialværdi, kan denne version af reduce() anvendes. Da strømmen dog kan være tom, returnerer metoden en Optional<T>.
Optional<T> reduce(BinaryOperator<T> accumulator);
Denne metode anvender accumulator-funktionen på alle elementer i strømmen og returnerer en Optional<T>.
Praktisk eksempel
Forestil dig en onlinebutik med en liste over produkter og deres priser. Målet er at beregne den samlede omsætning for alle produkter 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 kode opretter en liste af produkter, og bruger derefter reduce() til at summere priserne. Metoden map(Product::getPrice) udtrækker prisen for hvert produkt, mens Double::sum udfører summationen. Hvis resultatet er til stede, bliver det udskrevet.
reduce() med to parametre
Hvis du ønsker at sikre en garanteret returværdi, selv når strømmen er tom, skal du bruge reduce()-metoden med en identitetsparameter. Startværdien sikrer en stabil beregning.
T reduce(T identity, BinaryOperator<T> accumulator);
Denne version af reduce() starter med den angivne identity-værdi, hvilket sikrer, at et resultat altid returneres, selv for en tom stream.
Praktisk eksempel
Antag, at en butik har en kasse med en startsaldo, og du skal lægge den samlede pris for alle produkter til for at bestemme den mulige samlede 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 udtrækker koden priser med map(Product::getPrice) og anvender reduce(500.0, Double::sum), hvor 500.0 repræsenterer startsaldoen, og Double::sum lægger værdierne sammen.
reduce() til parallel behandling
Denne version af reduce() er designet til situationer, hvor der kræves mere komplekse transformationer, og resultater skal aggregeres i parallel.
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
Denne metode tager tre parametre:
identity– startværdien;accumulator– en funktion, der transformerer hvert element;combiner– en funktion, der sammenfletter delresultater.
Praktisk eksempel
I en onlinebutik er der behov for at beregne det samlede antal tegn i alle produktnavne. Dette kan være nyttigt for at fastsætte begrænsninger på kvitteringslængde.
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 gennemløber listen af produkter ved hjælp af reduce(), hvor 0 er startværdien, (sum, product) -> sum + product.getName().length() definerer logikken for opsummering af længderne på produktnavne, og Integer::sum kombinerer resultaterne i et parallelt behandlingsmiljø.
1. Hvilken datatype returnerer reduce(BinaryOperator<T> accumulator), hvis strømmen kan være tom?
2. Hvornår bør du bruge reduce(T identity, BinaryOperator<T> accumulator)?
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
Awesome!
Completion rate improved to 2.33
Aggregering af Elementer med Reduce()-Metoden
Stryg for at vise menuen
Ved arbejde med collections i Java er det ofte nødvendigt at reducere alle elementer til et enkelt resultat, såsom en sum, et produkt eller en anden aggregeret værdi.
Der findes tre varianter af reduce()-metoden, som hver især er designet til forskellige scenarier. Her gennemgås hver enkelt i detalje.
reduce() med én parameter
Hvis det er nødvendigt at aggregere elementer uden en initialværdi, kan denne version af reduce() anvendes. Da strømmen dog kan være tom, returnerer metoden en Optional<T>.
Optional<T> reduce(BinaryOperator<T> accumulator);
Denne metode anvender accumulator-funktionen på alle elementer i strømmen og returnerer en Optional<T>.
Praktisk eksempel
Forestil dig en onlinebutik med en liste over produkter og deres priser. Målet er at beregne den samlede omsætning for alle produkter 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 kode opretter en liste af produkter, og bruger derefter reduce() til at summere priserne. Metoden map(Product::getPrice) udtrækker prisen for hvert produkt, mens Double::sum udfører summationen. Hvis resultatet er til stede, bliver det udskrevet.
reduce() med to parametre
Hvis du ønsker at sikre en garanteret returværdi, selv når strømmen er tom, skal du bruge reduce()-metoden med en identitetsparameter. Startværdien sikrer en stabil beregning.
T reduce(T identity, BinaryOperator<T> accumulator);
Denne version af reduce() starter med den angivne identity-værdi, hvilket sikrer, at et resultat altid returneres, selv for en tom stream.
Praktisk eksempel
Antag, at en butik har en kasse med en startsaldo, og du skal lægge den samlede pris for alle produkter til for at bestemme den mulige samlede 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 udtrækker koden priser med map(Product::getPrice) og anvender reduce(500.0, Double::sum), hvor 500.0 repræsenterer startsaldoen, og Double::sum lægger værdierne sammen.
reduce() til parallel behandling
Denne version af reduce() er designet til situationer, hvor der kræves mere komplekse transformationer, og resultater skal aggregeres i parallel.
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
Denne metode tager tre parametre:
identity– startværdien;accumulator– en funktion, der transformerer hvert element;combiner– en funktion, der sammenfletter delresultater.
Praktisk eksempel
I en onlinebutik er der behov for at beregne det samlede antal tegn i alle produktnavne. Dette kan være nyttigt for at fastsætte begrænsninger på kvitteringslængde.
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 gennemløber listen af produkter ved hjælp af reduce(), hvor 0 er startværdien, (sum, product) -> sum + product.getName().length() definerer logikken for opsummering af længderne på produktnavne, og Integer::sum kombinerer resultaterne i et parallelt behandlingsmiljø.
1. Hvilken datatype returnerer reduce(BinaryOperator<T> accumulator), hvis strømmen kan være tom?
2. Hvornår bør du bruge reduce(T identity, BinaryOperator<T> accumulator)?
Tak for dine kommentarer!