Elementen Aggregeren met de reduce()-Methode
Bij het werken met collecties in Java is het vaak nodig om alle elementen te reduceren tot één resultaat, zoals een som, product of een andere geaggregeerde waarde.
Er zijn drie varianten van de reduce()-methode, elk ontworpen voor verschillende scenario's. We bespreken ze hieronder in detail.
reduce() met één parameter
Als je elementen wilt aggregëren zonder een initiële waarde, kun je deze versie van reduce() gebruiken. Omdat de stream echter leeg kan zijn, retourneert de methode een Optional<T>.
Optional<T> reduce(BinaryOperator<T> accumulator);
Deze methode past de accumulator-functie toe op alle elementen in de stream en retourneert een Optional<T>.
Praktisch Voorbeeld
Stel een online winkel voor met een lijst van producten en hun prijzen. Het doel is het berekenen van de totale omzet van alle producten in de winkel.
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; } }
Deze code maakt een lijst van producten en gebruikt vervolgens reduce() om de prijzen op te tellen. De methode map(Product::getPrice) haalt de prijs van elk product op, terwijl Double::sum de optelling uitvoert. Als het resultaat aanwezig is, wordt het afgedrukt.
reduce() met Twee Parameters
Als een gegarandeerde retourwaarde gewenst is, zelfs wanneer de stream leeg is, gebruik dan de reduce()-methode met een identiteitsparameter. De beginwaarde zorgt voor een stabiele berekening.
T reduce(T identity, BinaryOperator<T> accumulator);
Deze versie van reduce() begint met de opgegeven identity-waarde, waardoor altijd een resultaat wordt geretourneerd, zelfs bij een lege stream.
Praktisch voorbeeld
Stel dat een winkel een kassa heeft met een beginsaldo, en dat het nodig is om de totale prijs van alle producten op te tellen om het potentiële totale kassaldo te bepalen.
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; } }
Hier extraheert de code prijzen met map(Product::getPrice) en past reduce(500.0, Double::sum) toe, waarbij 500.0 het initiële saldo voorstelt en Double::sum de waarden optelt.
reduce() voor Parallelle Verwerking
Deze versie van reduce() is bedoeld voor situaties waarin meer complexe transformaties nodig zijn en resultaten in parallel moeten worden geaggregeerd.
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
Deze methode neemt drie parameters:
identity– de beginwaarde;accumulator– een functie die elk element transformeert;combiner– een functie die deelresultaten samenvoegt.
Praktisch Voorbeeld
In een webwinkel is het nodig om het totaal aantal tekens in alle productnamen te berekenen. Dit kan nuttig zijn voor het instellen van limieten op de bonlengte.
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; } }
De code doorloopt de lijst van producten met behulp van reduce(), waarbij 0 de initiële waarde is, (sum, product) -> sum + product.getName().length() de logica definieert voor het optellen van de lengtes van productnamen, en Integer::sum de resultaten combineert in een parallelle verwerking omgeving.
1. Welk gegevenstype retourneert reduce(BinaryOperator<T> accumulator) als de stream mogelijk leeg is?
2. Wanneer moet je reduce(T identity, BinaryOperator<T> accumulator) gebruiken?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.
Can you show me code examples for each reduce() variation?
What are some common use cases for each reduce() method?
Can you explain the difference between Optional<T> and T in the reduce() results?
Awesome!
Completion rate improved to 2.33
Elementen Aggregeren met de reduce()-Methode
Veeg om het menu te tonen
Bij het werken met collecties in Java is het vaak nodig om alle elementen te reduceren tot één resultaat, zoals een som, product of een andere geaggregeerde waarde.
Er zijn drie varianten van de reduce()-methode, elk ontworpen voor verschillende scenario's. We bespreken ze hieronder in detail.
reduce() met één parameter
Als je elementen wilt aggregëren zonder een initiële waarde, kun je deze versie van reduce() gebruiken. Omdat de stream echter leeg kan zijn, retourneert de methode een Optional<T>.
Optional<T> reduce(BinaryOperator<T> accumulator);
Deze methode past de accumulator-functie toe op alle elementen in de stream en retourneert een Optional<T>.
Praktisch Voorbeeld
Stel een online winkel voor met een lijst van producten en hun prijzen. Het doel is het berekenen van de totale omzet van alle producten in de winkel.
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; } }
Deze code maakt een lijst van producten en gebruikt vervolgens reduce() om de prijzen op te tellen. De methode map(Product::getPrice) haalt de prijs van elk product op, terwijl Double::sum de optelling uitvoert. Als het resultaat aanwezig is, wordt het afgedrukt.
reduce() met Twee Parameters
Als een gegarandeerde retourwaarde gewenst is, zelfs wanneer de stream leeg is, gebruik dan de reduce()-methode met een identiteitsparameter. De beginwaarde zorgt voor een stabiele berekening.
T reduce(T identity, BinaryOperator<T> accumulator);
Deze versie van reduce() begint met de opgegeven identity-waarde, waardoor altijd een resultaat wordt geretourneerd, zelfs bij een lege stream.
Praktisch voorbeeld
Stel dat een winkel een kassa heeft met een beginsaldo, en dat het nodig is om de totale prijs van alle producten op te tellen om het potentiële totale kassaldo te bepalen.
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; } }
Hier extraheert de code prijzen met map(Product::getPrice) en past reduce(500.0, Double::sum) toe, waarbij 500.0 het initiële saldo voorstelt en Double::sum de waarden optelt.
reduce() voor Parallelle Verwerking
Deze versie van reduce() is bedoeld voor situaties waarin meer complexe transformaties nodig zijn en resultaten in parallel moeten worden geaggregeerd.
<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);
Deze methode neemt drie parameters:
identity– de beginwaarde;accumulator– een functie die elk element transformeert;combiner– een functie die deelresultaten samenvoegt.
Praktisch Voorbeeld
In een webwinkel is het nodig om het totaal aantal tekens in alle productnamen te berekenen. Dit kan nuttig zijn voor het instellen van limieten op de bonlengte.
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; } }
De code doorloopt de lijst van producten met behulp van reduce(), waarbij 0 de initiële waarde is, (sum, product) -> sum + product.getName().length() de logica definieert voor het optellen van de lengtes van productnamen, en Integer::sum de resultaten combineert in een parallelle verwerking omgeving.
1. Welk gegevenstype retourneert reduce(BinaryOperator<T> accumulator) als de stream mogelijk leeg is?
2. Wanneer moet je reduce(T identity, BinaryOperator<T> accumulator) gebruiken?
Bedankt voor je feedback!