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.
1 2
| stream.filter(String::isEmpty);
//stream.filter(String::isNotEmpty); malheureusement cela n'existe pas. |
Suivant les développeurs les solutions sont variées.
1 2
| stream.filter(((Predicate)String::isEmpty).negate());
stream.filter(s -> !s.isEmpty()); |
et cela se complique quand le but est
//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
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
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
Partager