Consumer: Gegevens Verwerken
Veeg om het menu te tonen
Je hebt al veel functionele interfaces in Java onderzocht, maar wat als je een bewerking moet uitvoeren die een argument aanneemt, enkele wijzigingen toepast of een neveneffect veroorzaakt—zonder een resultaat terug te geven? Hiervoor wordt de Consumer functionele interface gebruikt.
Consumer-interface
Wordt vaak gebruikt voor het uitvoeren van acties die toestand wijzigen of neveneffecten veroorzaken zonder een waarde terug te geven.
De Consumer-interface maakt deel uit van het java.util.function package en is als volgt gedefinieerd:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
De methode accept(T t) neemt een object van het type T als invoer en voert een bewerking uit zonder een resultaat terug te geven.
Praktische Toepassing
Stel, er is een lijst van strings en voor elke string moet deze samen met een uniek id worden afgedrukt, gescheiden door een spatie. Dit kan worden bereikt met de Consumer-interface door elke string samen met zijn index (id) door te geven.
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); } }
In dit voorbeeld wordt Consumer gebruikt om elke string uit de lijst met een unieke identificatie te printen. De id voor elk element wordt berekend op basis van zijn index in de lijst, en het resultaat wordt afgedrukt in het formaat "id string". Hiermee kunnen lijstelementen verwerkt worden zonder expliciet een lus te gebruiken.
De code kan ook vereenvoudigd worden door de lambda-expressie direct binnen de forEach-lus te schrijven:
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)); } }
Zoals je kunt zien blijft het resultaat hetzelfde, terwijl de code bondiger en makkelijker leesbaar wordt.
Standaardmethode gebruiken
De Consumer-interface bevat ook een standaardmethode waarmee het combineren van meerdere bewerkingen mogelijk is.
Met de methode andThen() kun je twee Consumer-bewerkingen achter elkaar schakelen. De eerste Consumer wordt eerst uitgevoerd, gevolgd door de tweede.
Stel bijvoorbeeld dat je een lijst met namen hebt en je wilt twee taken uitvoeren: elke naam in hoofdletters afdrukken en vervolgens de lengte van die naam afdrukken. Door andThen() te gebruiken, kun je beide bewerkingen combineren in één enkele Consumer die ze opeenvolgend toepast.
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); } }
In dit voorbeeld wordt eerst de naam in hoofdletters afgedrukt, gevolgd door een streepje en de lengte van de naam. Met andThen() worden twee Consumer-operaties gecombineerd zodat de eerste de naam afdrukt en de tweede de lengte ervan afdrukt.
1. Wat doet de methode andThen() in de Consumer-interface?
2. Welk type gegevens accepteert de accept-methode in de Consumer-interface?
Bedankt voor je feedback!
Vraag AI
Vraag AI
Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.