Consumer: Bearbetning av Data
Du har redan utforskat många funktionella gränssnitt i Java, men vad händer om du behöver utföra en operation som tar ett argument, tillämpar vissa ändringar eller ger en bieffekt—utan att returnera ett resultat? Det är här det funktionella gränssnittet Consumer kommer in.
Consumer-gränssnittet
Det används ofta för att utföra åtgärder som modifierar tillstånd eller ger bieffekter utan att returnera ett värde.
Gränssnittet Consumer är en del av java.util.function package och definieras enligt följande:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
Metoden accept(T t) tar ett objekt av typen T som inmatning och utför en operation på det utan att returnera något resultat.
Praktisk tillämpning
Antag att du har en lista av strängar, och för varje sträng behöver du skriva ut den tillsammans med ett unikt id, separerat med ett mellanslag. Detta kan uppnås med hjälp av gränssnittet Consumer genom att skicka varje sträng tillsammans med dess index (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); } }
I detta exempel används Consumer för att skriva ut varje sträng från listan med ett unikt identifierare. Id för varje element beräknas med dess index i listan, och resultatet skrivs ut i formatet "id string". Detta möjliggör bearbetning av listelement utan att uttryckligen använda en loop.
Koden kan även förenklas genom att skriva lambda-uttrycket direkt i forEach-loopen:
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)); } }
Som du kan se förblir resultatet detsamma, medan koden blir mer koncis och lättare att läsa.
Användning av standardmetod
Gränssnittet Consumer innehåller även en standardmetod som möjliggör kombinering av flera operationer.
Metoden andThen() gör det möjligt att kedja två Consumer-operationer tillsammans. Den första Consumer körs först, följt av den andra.
Tänk dig till exempel att du har en lista med namn och vill utföra två uppgifter: skriva ut varje namn i versaler och sedan skriva ut längden på det namnet. Genom att använda andThen() kan du kombinera båda operationerna i en enda Consumer som tillämpar dem sekventiellt.
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); } }
I detta exempel skrivs först namnet ut i versaler, följt av ett bindestreck och namnets längd. Du använder andThen() för att kombinera två Consumer-operationer så att den första skriver ut namnet och den andra skriver ut dess längd.
1. Vad gör metoden andThen() i gränssnittet Consumer?
2. Vilken typ av data tar accept-metoden i gränssnittet Consumer emot?
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
Awesome!
Completion rate improved to 2.33
Consumer: Bearbetning av Data
Svep för att visa menyn
Du har redan utforskat många funktionella gränssnitt i Java, men vad händer om du behöver utföra en operation som tar ett argument, tillämpar vissa ändringar eller ger en bieffekt—utan att returnera ett resultat? Det är här det funktionella gränssnittet Consumer kommer in.
Consumer-gränssnittet
Det används ofta för att utföra åtgärder som modifierar tillstånd eller ger bieffekter utan att returnera ett värde.
Gränssnittet Consumer är en del av java.util.function package och definieras enligt följande:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
Metoden accept(T t) tar ett objekt av typen T som inmatning och utför en operation på det utan att returnera något resultat.
Praktisk tillämpning
Antag att du har en lista av strängar, och för varje sträng behöver du skriva ut den tillsammans med ett unikt id, separerat med ett mellanslag. Detta kan uppnås med hjälp av gränssnittet Consumer genom att skicka varje sträng tillsammans med dess index (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); } }
I detta exempel används Consumer för att skriva ut varje sträng från listan med ett unikt identifierare. Id för varje element beräknas med dess index i listan, och resultatet skrivs ut i formatet "id string". Detta möjliggör bearbetning av listelement utan att uttryckligen använda en loop.
Koden kan även förenklas genom att skriva lambda-uttrycket direkt i forEach-loopen:
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)); } }
Som du kan se förblir resultatet detsamma, medan koden blir mer koncis och lättare att läsa.
Användning av standardmetod
Gränssnittet Consumer innehåller även en standardmetod som möjliggör kombinering av flera operationer.
Metoden andThen() gör det möjligt att kedja två Consumer-operationer tillsammans. Den första Consumer körs först, följt av den andra.
Tänk dig till exempel att du har en lista med namn och vill utföra två uppgifter: skriva ut varje namn i versaler och sedan skriva ut längden på det namnet. Genom att använda andThen() kan du kombinera båda operationerna i en enda Consumer som tillämpar dem sekventiellt.
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); } }
I detta exempel skrivs först namnet ut i versaler, följt av ett bindestreck och namnets längd. Du använder andThen() för att kombinera två Consumer-operationer så att den första skriver ut namnet och den andra skriver ut dess längd.
1. Vad gör metoden andThen() i gränssnittet Consumer?
2. Vilken typ av data tar accept-metoden i gränssnittet Consumer emot?
Tack för dina kommentarer!