Dernière modification : 24/08/2022

Predicate - Java 8

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 other);
    default Predicate negate();
    default Predicate or(Predicate other);
    static  Predicate isEqual(Object targetRef);
    static  Predicate not(Predicate target);
}

Remarques :

  • Les predicates peuvent s'enchaîner car la plus part renvoient un predicate.
  • La méthode "test" est la méthode principale pour l'évaluation.

1. Predicate dans des filtres

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]

2. La méthode and()

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]

3. La méthode or()

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]

4. la méthode negate()

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.