Consumer: 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
12345678910111213141516171819package 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
123456789101112package 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
12345678910111213141516171819202122package 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?
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 2.33
Consumer: 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
12345678910111213141516171819package 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
123456789101112package 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
12345678910111213141516171819202122package 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?
Kiitos palautteestasi!