Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Consumer: Tietojen Käsittely | Stream API:n Perusteet ja Toiminnalliset Ominaisuudet
Stream API

bookConsumer: Tietojen Käsittely

Olet jo tutustunut moniin funktionaalisiin rajapintoihin Javassa, mutta entä jos sinun täytyy suorittaa operaatio, joka ottaa argumentin, tekee joitakin muutoksia tai aiheuttaa sivuvaikutuksen—ilman, että se palauttaa tulosta? Tässä kohtaa Consumer-funktionaalinen rajapinta tulee käyttöön.

Consumer-rajapinta

Sitä käytetään yleisesti suorittamaan toimintoja, jotka muokkaavat tilaa tai aiheuttavat sivuvaikutuksia palauttamatta arvoa.

Consumer-rajapinta kuuluu java.util.function package-pakettiin ja se on määritelty seuraavasti:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

Metodi accept(T t) ottaa objektin tyyppiä T syötteenä ja suorittaa sille operaation palauttamatta tulosta.

Käytännön sovellus

Oletetaan, että käytössä on merkkijonolista, ja jokainen merkkijono tulee tulostaa yhdessä yksilöllisen id:n kanssa, erotettuna välilyönnillä. Tämä voidaan toteuttaa käyttämällä Consumer-rajapintaa välittämällä jokainen merkkijono sekä sen indeksi (id).

Main.java

Main.java

copy
12345678910111213141516171819
package com.example; import java.util.List; import java.util.function.Consumer; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); // Creating a `Consumer` that prints each string with its id Consumer<String> printNameWithId = (name) -> { int id = names.indexOf(name) + 1; // id = index + 1 System.out.println(id + " " + name); }; // Using `Consumer` to print each string with its id names.forEach(printNameWithId); } }

Tässä esimerkissä käytetään Consumer-rajapintaa tulostamaan jokainen merkkijono listasta käyttäen yksilöllistä tunnistetta. Jokaisen alkion id lasketaan sen indeksin perusteella listassa, ja tulos tulostetaan muodossa "id string". Tämä mahdollistaa listan alkioiden käsittelyn ilman, että käytetään erikseen silmukkaa.

Koodia voidaan myös yksinkertaistaa kirjoittamalla lambda-lauseke suoraan forEach-silmukan sisään:

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.List; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); // Using `forEach` with a lambda expression to print the ID and name names.forEach(name -> System.out.println((names.indexOf(name) + 1) + " " + name)); } }

Kuten huomaat, tulos pysyy samana, mutta koodi on ytimekkäämpi ja helpompi lukea.

Oletusmetodin käyttö

Consumer-rajapinta sisältää myös oletusmetodin, jonka avulla voidaan yhdistää useita operaatioita.

andThen()-metodi mahdollistaa kahden Consumer-operaation ketjuttamisen. Ensimmäinen Consumer suoritetaan ensin, jonka jälkeen toinen.

Kuvittele esimerkiksi, että sinulla on nimilista ja haluat tehdä kaksi asiaa: tulostaa jokaisen nimen isoilla kirjaimilla ja sen jälkeen tulostaa nimen pituuden. Käyttämällä andThen()-metodia voit yhdistää molemmat operaatiot yhdeksi Consumer-olioksi, joka suorittaa ne peräkkäin.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.List; import java.util.function.Consumer; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); // First `Consumer` — prints the name in uppercase Consumer<String> printUpperCase = name -> System.out.print(name.toUpperCase() + " - "); // Second `Consumer` — prints the length of the name Consumer<String> printLength = name -> System.out.println(name.length()); // Combine both `Consumers` using `andThen()` Consumer<String> combinedConsumer = printUpperCase.andThen(printLength); // Apply the combined `Consumer` to each name names.forEach(combinedConsumer); } }

Tässä esimerkissä tulostat ensin nimen isoilla kirjaimilla, jonka jälkeen viivan ja nimen pituuden. Käytät andThen()-metodia yhdistääksesi kaksi Consumer-operaatiota siten, että ensimmäinen tulostaa nimen ja toinen sen pituuden.

1. Mitä andThen()-metodi tekee Consumer-rajapinnassa?

2. Minkä tyyppistä dataa Consumer-rajapinnan accept-metodi ottaa vastaan?

question mark

Mitä andThen()-metodi tekee Consumer-rajapinnassa?

Select the correct answer

question mark

Minkä tyyppistä dataa Consumer-rajapinnan accept-metodi ottaa vastaan?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 11

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

bookConsumer: Tietojen Käsittely

Pyyhkäise näyttääksesi valikon

Olet jo tutustunut moniin funktionaalisiin rajapintoihin Javassa, mutta entä jos sinun täytyy suorittaa operaatio, joka ottaa argumentin, tekee joitakin muutoksia tai aiheuttaa sivuvaikutuksen—ilman, että se palauttaa tulosta? Tässä kohtaa Consumer-funktionaalinen rajapinta tulee käyttöön.

Consumer-rajapinta

Sitä käytetään yleisesti suorittamaan toimintoja, jotka muokkaavat tilaa tai aiheuttavat sivuvaikutuksia palauttamatta arvoa.

Consumer-rajapinta kuuluu java.util.function package-pakettiin ja se on määritelty seuraavasti:

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
}

Metodi accept(T t) ottaa objektin tyyppiä T syötteenä ja suorittaa sille operaation palauttamatta tulosta.

Käytännön sovellus

Oletetaan, että käytössä on merkkijonolista, ja jokainen merkkijono tulee tulostaa yhdessä yksilöllisen id:n kanssa, erotettuna välilyönnillä. Tämä voidaan toteuttaa käyttämällä Consumer-rajapintaa välittämällä jokainen merkkijono sekä sen indeksi (id).

Main.java

Main.java

copy
12345678910111213141516171819
package com.example; import java.util.List; import java.util.function.Consumer; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); // Creating a `Consumer` that prints each string with its id Consumer<String> printNameWithId = (name) -> { int id = names.indexOf(name) + 1; // id = index + 1 System.out.println(id + " " + name); }; // Using `Consumer` to print each string with its id names.forEach(printNameWithId); } }

Tässä esimerkissä käytetään Consumer-rajapintaa tulostamaan jokainen merkkijono listasta käyttäen yksilöllistä tunnistetta. Jokaisen alkion id lasketaan sen indeksin perusteella listassa, ja tulos tulostetaan muodossa "id string". Tämä mahdollistaa listan alkioiden käsittelyn ilman, että käytetään erikseen silmukkaa.

Koodia voidaan myös yksinkertaistaa kirjoittamalla lambda-lauseke suoraan forEach-silmukan sisään:

Main.java

Main.java

copy
123456789101112
package com.example; import java.util.List; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); // Using `forEach` with a lambda expression to print the ID and name names.forEach(name -> System.out.println((names.indexOf(name) + 1) + " " + name)); } }

Kuten huomaat, tulos pysyy samana, mutta koodi on ytimekkäämpi ja helpompi lukea.

Oletusmetodin käyttö

Consumer-rajapinta sisältää myös oletusmetodin, jonka avulla voidaan yhdistää useita operaatioita.

andThen()-metodi mahdollistaa kahden Consumer-operaation ketjuttamisen. Ensimmäinen Consumer suoritetaan ensin, jonka jälkeen toinen.

Kuvittele esimerkiksi, että sinulla on nimilista ja haluat tehdä kaksi asiaa: tulostaa jokaisen nimen isoilla kirjaimilla ja sen jälkeen tulostaa nimen pituuden. Käyttämällä andThen()-metodia voit yhdistää molemmat operaatiot yhdeksi Consumer-olioksi, joka suorittaa ne peräkkäin.

Main.java

Main.java

copy
12345678910111213141516171819202122
package com.example; import java.util.List; import java.util.function.Consumer; public class Main { public static void main(String[] args) { List<String> names = List.of("Alice", "Bob", "Charlie"); // First `Consumer` — prints the name in uppercase Consumer<String> printUpperCase = name -> System.out.print(name.toUpperCase() + " - "); // Second `Consumer` — prints the length of the name Consumer<String> printLength = name -> System.out.println(name.length()); // Combine both `Consumers` using `andThen()` Consumer<String> combinedConsumer = printUpperCase.andThen(printLength); // Apply the combined `Consumer` to each name names.forEach(combinedConsumer); } }

Tässä esimerkissä tulostat ensin nimen isoilla kirjaimilla, jonka jälkeen viivan ja nimen pituuden. Käytät andThen()-metodia yhdistääksesi kaksi Consumer-operaatiota siten, että ensimmäinen tulostaa nimen ja toinen sen pituuden.

1. Mitä andThen()-metodi tekee Consumer-rajapinnassa?

2. Minkä tyyppistä dataa Consumer-rajapinnan accept-metodi ottaa vastaan?

question mark

Mitä andThen()-metodi tekee Consumer-rajapinnassa?

Select the correct answer

question mark

Minkä tyyppistä dataa Consumer-rajapinnan accept-metodi ottaa vastaan?

Select the correct answer

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 1. Luku 11
some-alt