Bonjour,

étant encore contraint à java8 dans de nombreux dev, je rencontre régulièrement des codes ou se pose la question de la négation ou la combinaison de prédicats.
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
stream.filter(String::isEmpty);
//stream.filter(String::isNotEmpty); malheureusement cela n'existe pas.

Suivant les développeurs les solutions sont variées.
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
stream.filter(((Predicate)String::isEmpty).negate());
stream.filter(s -> !s.isEmpty());

et cela se complique quand le but est
Code : Sélectionner tout - Visualiser dans une fenêtre à part
//stream.filter(Object::nonNull AND String::isNotEmpty);
et je vous laisse imaginer toutes sortes de combinaisons de prédicats dont on peut avoir besoin.

Java11 apporte une solution mais il est très simple de la mettre en Oeuvre en java8
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
class PredicateLogic {
  public static <R> Predicate<R> not(Predicate<R> predicate) {
    return predicate.negate();
  }
 
  public static <R> Predicate<R> and(Predicate<R> predicate, Predicate<R> other) {
    return predicate.and(other);
  }
 
  public static <R> Predicate<R> or(Predicate<R> predicate, Predicate<R> other) {
    return predicate.or(other);
  }
}

ensuite cela devient simple
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
 
import static ..... PredicateLogic.*;
 
stream.filter(not(String::isEmpty));
stream.filter(and(Object::nonNull, not(String::isEmpty)));
à un détail près cela rends le code compatible java11. Dans java11 la méthode not, sont portées par java.util.function.Predicate.

A+JYT