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:
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:
1
2 stream.filter(((Predicate)String::isEmpty).negate()); stream.filter(s -> !s.isEmpty());
et cela se complique quand le but estet je vous laisse imaginer toutes sortes de combinaisons de prédicats dont on peut avoir besoin.Code://stream.filter(Object::nonNull AND String::isNotEmpty);
Java11 apporte une solution mais il est très simple de la mettre en Oeuvre en java8
Code:
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
à 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.Code:
1
2
3
4
5 import static ..... PredicateLogic.*; stream.filter(not(String::isEmpty)); stream.filter(and(Object::nonNull, not(String::isEmpty)));
A+JYT