Consumer în Java

O acțiune care primește o valoare și nu returnează nimic (afișează, salvează, trimite); o rulezi cu accept.

Sintaxă
import java.util.function.Consumer;

@FunctionalInterface
public interface Consumer<T> {
    void accept(T t);
    default Consumer<T> andThen(Consumer<? super T> dupa)
}

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. Un Consumer nu returnează nimic; dacă ai nevoie de rezultat, folosește Function.
  • Modifici din Consumer lista pe care o parcurgi cu forEach: primești ConcurrentModificationException.

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).