Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Consumer: Datenverarbeitung | Grundlagen und Funktionale Möglichkeiten der Stream-API
Stream-API

bookConsumer: Datenverarbeitung

Sie haben bereits viele funktionale Schnittstellen in Java kennengelernt, aber was ist, wenn Sie eine Operation ausführen müssen, die ein Argument entgegennimmt, einige Änderungen vornimmt oder einen Seiteneffekt erzeugt—ohne ein Ergebnis zurückzugeben? Genau hierfür wird die funktionale Schnittstelle Consumer verwendet.

Consumer-Schnittstelle

Sie wird häufig verwendet, um Aktionen auszuführen, die den Zustand verändern oder Seiteneffekte erzeugen, ohne einen Wert zurückzugeben.

Die Consumer-Schnittstelle ist Teil des Pakets java.util.function package und wie folgt definiert:

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

Die Methode accept(T t) nimmt ein Objekt vom Typ T als Eingabe entgegen und führt eine Operation darauf aus, ohne ein Ergebnis zurückzugeben.

Praktische Anwendung

Angenommen, es gibt eine Liste von Strings und zu jedem String soll eine eindeutige ID zusammen mit dem String, getrennt durch ein Leerzeichen, ausgegeben werden. Dies lässt sich mit dem Consumer-Interface umsetzen, indem jeder String zusammen mit seinem Index (id) übergeben wird.

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); } }

In diesem Beispiel wird Consumer verwendet, um jede Zeichenkette aus der Liste mit einer eindeutigen Kennung auszugeben. Die ID für jedes Element wird anhand seines Index in der Liste berechnet und das Ergebnis im Format "id string" ausgegeben. Dadurch ist es möglich, Listenelemente zu verarbeiten, ohne explizit eine Schleife zu verwenden.

Der Code kann zusätzlich vereinfacht werden, indem der Lambda-Ausdruck direkt innerhalb der forEach-Schleife geschrieben wird:

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)); } }

Wie Sie sehen, bleibt das Ergebnis gleich, während der Code kürzer und leichter lesbar wird.

Verwendung der Default-Methode

Das Interface Consumer enthält außerdem eine Default-Methode, die das Kombinieren mehrerer Operationen ermöglicht.

Mit der Methode andThen() können Sie zwei Consumer-Operationen verkettet ausführen. Zuerst wird der erste Consumer ausgeführt, danach der zweite.

Stellen Sie sich zum Beispiel vor, Sie haben eine Liste von Namen und möchten zwei Aufgaben erledigen: Jeden Namen in Großbuchstaben ausgeben und anschließend die Länge dieses Namens ausgeben. Mit andThen() können Sie beide Operationen in einem einzigen Consumer nacheinander anwenden.

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); } }

In diesem Beispiel wird zunächst der Name in Großbuchstaben ausgegeben, gefolgt von einem Bindestrich und der Länge des Namens. Mit andThen() werden zwei Consumer-Operationen kombiniert, sodass zuerst der Name und anschließend dessen Länge ausgegeben wird.

1. Was bewirkt die Methode andThen() im Interface Consumer?

2. Welchen Datentyp nimmt die Methode accept im Interface Consumer entgegen?

question mark

Was bewirkt die Methode andThen() im Interface Consumer?

Select the correct answer

question mark

Welchen Datentyp nimmt die Methode accept im Interface Consumer entgegen?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 11

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Suggested prompts:

Can you show an example of using the Consumer interface with a list?

How does the andThen() method work in practice?

What are some common use cases for the Consumer interface?

Awesome!

Completion rate improved to 2.33

bookConsumer: Datenverarbeitung

Swipe um das Menü anzuzeigen

Sie haben bereits viele funktionale Schnittstellen in Java kennengelernt, aber was ist, wenn Sie eine Operation ausführen müssen, die ein Argument entgegennimmt, einige Änderungen vornimmt oder einen Seiteneffekt erzeugt—ohne ein Ergebnis zurückzugeben? Genau hierfür wird die funktionale Schnittstelle Consumer verwendet.

Consumer-Schnittstelle

Sie wird häufig verwendet, um Aktionen auszuführen, die den Zustand verändern oder Seiteneffekte erzeugen, ohne einen Wert zurückzugeben.

Die Consumer-Schnittstelle ist Teil des Pakets java.util.function package und wie folgt definiert:

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

Die Methode accept(T t) nimmt ein Objekt vom Typ T als Eingabe entgegen und führt eine Operation darauf aus, ohne ein Ergebnis zurückzugeben.

Praktische Anwendung

Angenommen, es gibt eine Liste von Strings und zu jedem String soll eine eindeutige ID zusammen mit dem String, getrennt durch ein Leerzeichen, ausgegeben werden. Dies lässt sich mit dem Consumer-Interface umsetzen, indem jeder String zusammen mit seinem Index (id) übergeben wird.

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); } }

In diesem Beispiel wird Consumer verwendet, um jede Zeichenkette aus der Liste mit einer eindeutigen Kennung auszugeben. Die ID für jedes Element wird anhand seines Index in der Liste berechnet und das Ergebnis im Format "id string" ausgegeben. Dadurch ist es möglich, Listenelemente zu verarbeiten, ohne explizit eine Schleife zu verwenden.

Der Code kann zusätzlich vereinfacht werden, indem der Lambda-Ausdruck direkt innerhalb der forEach-Schleife geschrieben wird:

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)); } }

Wie Sie sehen, bleibt das Ergebnis gleich, während der Code kürzer und leichter lesbar wird.

Verwendung der Default-Methode

Das Interface Consumer enthält außerdem eine Default-Methode, die das Kombinieren mehrerer Operationen ermöglicht.

Mit der Methode andThen() können Sie zwei Consumer-Operationen verkettet ausführen. Zuerst wird der erste Consumer ausgeführt, danach der zweite.

Stellen Sie sich zum Beispiel vor, Sie haben eine Liste von Namen und möchten zwei Aufgaben erledigen: Jeden Namen in Großbuchstaben ausgeben und anschließend die Länge dieses Namens ausgeben. Mit andThen() können Sie beide Operationen in einem einzigen Consumer nacheinander anwenden.

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); } }

In diesem Beispiel wird zunächst der Name in Großbuchstaben ausgegeben, gefolgt von einem Bindestrich und der Länge des Namens. Mit andThen() werden zwei Consumer-Operationen kombiniert, sodass zuerst der Name und anschließend dessen Länge ausgegeben wird.

1. Was bewirkt die Methode andThen() im Interface Consumer?

2. Welchen Datentyp nimmt die Methode accept im Interface Consumer entgegen?

question mark

Was bewirkt die Methode andThen() im Interface Consumer?

Select the correct answer

question mark

Welchen Datentyp nimmt die Methode accept im Interface Consumer entgegen?

Select the correct answer

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 1. Kapitel 11
some-alt