Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Alkioiden Yhdistäminen Reduce()-Menetelmällä | Osio
Stream API Javassa

bookAlkioiden Yhdistäminen Reduce()-Menetelmällä

Pyyhkäise näyttääksesi valikon

Työskenneltäessä kokoelmien kanssa Javassa on usein tarpeen yhdistää kaikki alkiot yhdeksi tulokseksi, kuten summaksi, tuloksi tai muuksi yhdistetyksi arvoksi.

reduce()-menetelmästä on olemassa kolme eri versiota, jotka on suunniteltu erilaisiin tilanteisiin. Käydään jokainen niistä läpi yksityiskohtaisesti.

reduce() yhdellä parametrilla

Jos haluat yhdistää alkiot ilman alkuarvoa, voit käyttää tätä reduce()-version. Koska virta voi kuitenkin olla tyhjä, menetelmä palauttaa Optional<T>-olion.

Optional<T> reduce(BinaryOperator<T> accumulator);

Tämä metodi soveltaa accumulator-funktiota kaikkiin virran alkioihin ja palauttaa Optional<T>-olion.

Käytännön esimerkki

Kuvitellaan verkkokauppa, jossa on lista tuotteista ja niiden hinnoista. Tavoitteena on laskea kaikkien tuotteiden kokonaistuotto kaupassa.

Main.java

Main.java

copy
1234567891011121314151617181920212223242526272829303132333435363738
package 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; } }

Tämä koodi luo tuotteiden listan ja käyttää reduce()-metodia hintojen summaamiseen. map(Product::getPrice)-metodi poimii jokaisen tuotteen hinnan, kun taas Double::sum suorittaa yhteenlaskun. Jos tulos on olemassa, se tulostetaan.

reduce() kahdella parametrilla

Jos halutaan varmistaa paluuarvo myös silloin, kun virta on tyhjä, käytetään reduce()-metodia identiteettiparametrilla. Alkuarvo takaa vakaan laskennan.

T reduce(T identity, BinaryOperator<T> accumulator);

Tämä reduce()-metodin versio aloittaa annetulla identity-arvolla, mikä varmistaa, että tulos palautetaan aina, jopa tyhjälle virralle.

Käytännön esimerkki

Oletetaan, että kaupalla on kassakone, jossa on alkusaldo, ja sinun täytyy lisätä kaikkien tuotteiden kokonaishinta määrittääksesi mahdollisen kokonaiskassan.

Main.java

Main.java

copy
12345678910111213141516171819202122232425262728293031323334353637
package 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; } }

Tässä koodi poimii hinnat käyttäen map(Product::getPrice) ja soveltaa reduce(500.0, Double::sum), jossa 500.0 edustaa alkusaldoa ja Double::sum laskee arvot yhteen.

reduce() rinnakkaiseen käsittelyyn

Tämä reduce()-version tarkoituksena on tilanteet, joissa tarvitaan monimutkaisempia muunnoksia ja tulokset täytyy yhdistää rinnakkain.

<U> U reduce(U identity, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner);

Tämä metodi ottaa kolme parametria:

  • identityalkuarvo;
  • accumulator – funktio, joka muuntaa jokaisen alkion;
  • combiner – funktio, joka yhdistää osatulokset.

Käytännön esimerkki

Verkkokaupassa täytyy laskea kaikkien tuotenimien merkkien kokonaismäärä. Tämä voi olla hyödyllistä, kun asetetaan rajoituksia kuitin pituudelle.

Main.java

Main.java

copy
123456789101112131415161718192021222324252627282930313233343536
package 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; } }

Koodi käy läpi tuotteiden listan käyttäen reduce()-metodia, jossa 0 toimii alkuarvona, (sum, product) -> sum + product.getName().length() määrittää tuotenimien pituuksien summauksen logiikan, ja Integer::sum yhdistää tulokset rinnakkaisessa käsittelyssä.

1. Mitä tietotyyppiä reduce(BinaryOperator<T> accumulator) palauttaa, jos virta voi olla tyhjä?

2. Milloin tulisi käyttää reduce(T identity, BinaryOperator<T> accumulator)?

question mark

Mitä tietotyyppiä reduce(BinaryOperator<T> accumulator) palauttaa, jos virta voi olla tyhjä?

Select the correct answer

question mark

Milloin tulisi käyttää reduce(T identity, BinaryOperator<T> accumulator)?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 32

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme

Osio 1. Luku 32
some-alt