Ce face Consumer
Consumer<T> „consumă” o valoare: face ceva cu ea, dar nu returnează nimic (void). Exemple: afișarea, scrierea într-un fișier, adăugarea într-o listă. Metoda accept(valoare) rulează acțiunea.
forEach pe liste și stream-uri primește un Consumer; de aceea scrii lista.forEach(System.out::println). Cu andThen legi două acțiuni pentru aceeași valoare. Pentru două valori există BiConsumer, folosit de Map.forEach.
Parametri
| Parametru | Descriere |
|---|---|
t |
Pentru accept: valoarea pe care se face acțiunea. |
Ce returnează
accept nu returnează nimic (void).
Exemple
Exemplul 1: Acțiuni păstrate în variabile
import java.util.List;
import java.util.function.Consumer;
public class Main {
public static void main(String[] args) {
Consumer<String> saluta = nume -> System.out.println("Bună, " + nume + "!");
saluta.accept("Ana");
Consumer<String> numara = nume -> System.out.println(" (" + nume.length() + " litere)");
List.of("Mihai", "Ioana").forEach(saluta.andThen(numara));
}
}
Rezultat
Bună, Ana!
Bună, Mihai!
(5 litere)
Bună, Ioana!
(5 litere)
Exemplul 2: O metodă care primește ce să facă cu fiecare rezultat
Aceeași metodă afișează într-un caz și strânge într-o listă în celălalt.
import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
public class Main {
static void notePromovate(int[] note, Consumer<Integer> actiune) {
for (int n : note) {
if (n >= 5) {
actiune.accept(n);
}
}
}
public static void main(String[] args) {
int[] note = {9, 4, 7, 3, 10};
notePromovate(note, n -> System.out.println("Promovat cu " + n));
List<Integer> colectate = new ArrayList<>();
notePromovate(note, colectate::add);
System.out.println("Strânse: " + colectate);
}
}
Rezultat
Promovat cu 9
Promovat cu 7
Promovat cu 10
Strânse: [9, 7, 10]
Greșeli frecvente
- Aștepți un rezultat de la
accept. UnConsumernu returnează nimic; dacă ai nevoie de rezultat, foloseșteFunction. - Modifici din
Consumerlista pe care o parcurgi cuforEach: primeștiConcurrentModificationException.
Comenzi înrudite
Supplier: Un „furnizor” de valori: nu primește nimic și returnează o valoare când apelezi get; util pentru valori create la nevoie.Function: O funcție care primește o valoare de tip T și returnează una de tip R; o apelezi cu apply.Stream.forEach: Rulează o acțiune (de obicei o afișare) pentru fiecare element; forEachOrdered păstrează ordinea și la stream-uri paralele.BiFunction: O funcție cu doi parametri (de tipuri T și U) care returnează un R; o apelezi cu apply(a, b).