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ä | Stream API:n Pääteoperaatiot
Stream API

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

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

reduce()-metodista on olemassa kolme muunnelmaa, joista jokainen on tarkoitettu eri tilanteisiin. Käydään läpi jokainen yksityiskohtaisesti.

reduce() yhdellä parametrilla

Jos haluat yhdistää alkiot ilman alkuarvoa, voit käyttää tätä reduce()-version. Koska virta voi kuitenkin olla tyhjä, metodi 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 luettelo tuotteista ja niiden hinnoista. Tavoitteena on laskea kaikkien tuotteiden kokonaistulot 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 yhteenlaskemiseen. map(Product::getPrice)-metodi poimii jokaisen tuotteen hinnan, kun taas Double::sum suorittaa yhteenlaskun. Jos tulos on olemassa, se tulostetaan.

reduce() kahdella parametrilla

Jos haluat varmistaa paluuarvon myös silloin, kun virta on tyhjä, käytä reduce()-metodia identiteettiparametrin kanssa. 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, vaikka virta olisi tyhjä.

Käytännön esimerkki

Oletetaan, että kaupalla on kassakone, jossa on alkusaldo, ja sinun täytyy laskea yhteen kaikkien tuotteiden kokonaishinnat 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() rinnakkaiskäsittelyssä

Tämä reduce()-version tarkoituksena on mahdollistaa monimutkaisemmat muunnokset ja tulosten yhdistäminen 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 3. Luku 6

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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

Awesome!

Completion rate improved to 2.33

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()-metodista on olemassa kolme muunnelmaa, joista jokainen on tarkoitettu eri tilanteisiin. Käydään läpi jokainen yksityiskohtaisesti.

reduce() yhdellä parametrilla

Jos haluat yhdistää alkiot ilman alkuarvoa, voit käyttää tätä reduce()-version. Koska virta voi kuitenkin olla tyhjä, metodi 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 luettelo tuotteista ja niiden hinnoista. Tavoitteena on laskea kaikkien tuotteiden kokonaistulot 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 yhteenlaskemiseen. map(Product::getPrice)-metodi poimii jokaisen tuotteen hinnan, kun taas Double::sum suorittaa yhteenlaskun. Jos tulos on olemassa, se tulostetaan.

reduce() kahdella parametrilla

Jos haluat varmistaa paluuarvon myös silloin, kun virta on tyhjä, käytä reduce()-metodia identiteettiparametrin kanssa. 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, vaikka virta olisi tyhjä.

Käytännön esimerkki

Oletetaan, että kaupalla on kassakone, jossa on alkusaldo, ja sinun täytyy laskea yhteen kaikkien tuotteiden kokonaishinnat 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() rinnakkaiskäsittelyssä

Tämä reduce()-version tarkoituksena on mahdollistaa monimutkaisemmat muunnokset ja tulosten yhdistäminen 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 3. Luku 6
some-alt