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.Predicateeste tipul potrivit și areand/or/negate. - Te încurci între
filter(păstrează ce trece testul) șiremoveIf(ș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).