Predicate în Java

O condiție: primește o valoare și răspunde true sau false prin metoda test; folosită de filter, removeIf, anyMatch.

Sintaxă
import java.util.function.Predicate;

@FunctionalInterface
public interface Predicate<T> {
    boolean test(T t);
}

Ce face Predicate

Predicate<T> reprezintă o întrebare cu răspuns da/nu despre o valoare de tip T: „este nota de trecere?”, „începe cu A?”. Metoda test(valoare) returnează true sau false.

Îl creezi dintr-o lambda: Predicate<Integer> trecut = n -> n >= 5; sau dintr-o referință de metodă: String::isEmpty. Se dă mai departe metodelor care filtrează: stream.filter, list.removeIf, anyMatch, partitioningBy.

Predicatele se combină cu and, or, negate și Predicate.not, fără să scrii o lambda nouă.

Parametri

Parametru Descriere
t Pentru test: valoarea verificată.

Ce returnează

test returnează true dacă valoarea îndeplinește condiția.

Exemple

Exemplul 1: Condiții păstrate în variabile

import java.util.function.Predicate;

public class Main {
    public static void main(String[] args) {
        Predicate<Integer> trecut = n -> n >= 5;
        Predicate<String> emailValid = s -> s.contains("@") && s.endsWith(".ro");

        System.out.println(trecut.test(7));
        System.out.println(trecut.test(4));
        System.out.println(emailValid.test("ana@exemplu.ro"));
        System.out.println(emailValid.test("ana.exemplu.ro"));
    }
}

Rezultat

true
false
true
false

Exemplul 2: Același predicat în filter și removeIf

filter păstrează elementele pentru care testul e true; removeIf le șterge pe acelea.

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

public class Main {
    public static void main(String[] args) {
        Predicate<String> scurt = s -> s.length() <= 4;
        List<String> orase = new ArrayList<>(List.of("Iași", "Constanța", "Arad", "Sibiu", "Cluj"));

        System.out.println("Scurte: " + orase.stream().filter(scurt).toList());
        orase.removeIf(scurt);
        System.out.println("Rămase: " + orase);
    }
}

Rezultat

Scurte: [Iași, Arad, Cluj]
Rămase: [Constanța, Sibiu]

Greșeli frecvente

  • Folosești Function<T, Boolean> pentru o condiție. Predicate este tipul potrivit și are and/or/negate.
  • Te încurci între filter (păstrează ce trece testul) și removeIf (șterge ce trece testul).

Comenzi înrudite

  • Predicate.and: Combină condiții: and (ambele adevărate), or (cel puțin una) și negate (condiția inversă).
  • Predicate.not: Inversează o condiție dată ca referință de metodă: filter(Predicate.not(String::isBlank)) păstrează textele care nu sunt goale.
  • Stream.filter: Păstrează în stream doar elementele care îndeplinesc o condiție.
  • Stream.anyMatch: Verifică dacă cel puțin un element (anyMatch), toate (allMatch) sau niciunul (noneMatch) nu îndeplinesc o condiție.
  • Collectors.partitioningBy: Împarte elementele în două grupuri, după o condiție: cele care o îndeplinesc (true) și celelalte (false).