Les predicates sont des interfaces fonctionnelles ayant un seul argument en entrée et retournent un boolean. Ils sont principalement utilisés lors des filtrages. Sa définition est la suivante :
@FunctionalInterface
public interface Predicate {
boolean test(T t);
default Predicate and(Predicate super T> other);
default Predicate negate();
default Predicate or(Predicate super T> other);
static Predicate isEqual(Object targetRef);
static Predicate not(Predicate super T> target);
}
Remarques :
Les filtres des Stream acceptent des predicates :
final List list = Arrays.asList("Alex", "Claire", "Angel");
final List result = list.stream().filter(x -> x.startsWith("A")).collect(Collectors.toList());
System.out.println(result); // [Alex, Angel]
Ou encore, avec une déclaration plus explicite du predicate :
final Predicate predicate = x -> x.startsWith("A");
final List list = Arrays.asList("Alex", "Claire", "Angel");
final List result = list.stream().filter(predicate).collect(Collectors.toList());
System.out.println(result); // [Alex, Angel]
final Predicate predicate = x -> x.startsWith("A");
final Predicate predicate2 = x -> x.endsWith("x");
final List list = Arrays.asList("Alex", "Claire", "Angel", "Sorin");
final List result = list.stream().filter(predicate.and(predicate2)).collect(Collectors.toList());
System.out.println(result); // [Alex]
Est équivalent au niveau du résultat au code suivant :
final List list = Arrays.asList("Alex", "Claire", "Angel", "Sorin");
final List result = list.stream().filter(x -> x.startsWith("A") && x.endsWith("x")).collect(Collectors.toList());
System.out.println(result); // [Alex]
final Predicate predicate = x -> x.startsWith("A");
final Predicate predicate2 = x -> x.endsWith("n");
final List list = Arrays.asList("Alex", "Claire", "Angel", "Sorin");
final List result = list.stream().filter(predicate.or(predicate2)).collect(Collectors.toList());
System.out.println(result); // [Alex, Angel, Sorin]
final Predicate predicate = x -> x.startsWith("A");
final List list = Arrays.asList("Alex", "Claire", "Angel", "Sorin");
final List result = list.stream().filter(predicate.negate()).collect(Collectors.toList());
System.out.println(result); // [Claire, Sorin]
Remarque : Il est possible de fournir un objet personalisé et le récupérer après le filtrage.