Predicate.not() для отрицания
Использование Predicate.not() для чистого отрицания ссылок на методы вместо написания лямбда-обёрток.
Сравнение кода
✕ Java 8
List<String> nonEmpty = list.stream()
.filter(s -> !s.isBlank())
.collect(Collectors.toList());
✓ Java 11+
List<String> nonEmpty = list.stream()
.filter(Predicate.not(String::isBlank))
.toList();
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Чистое отрицание
Не нужны лямбда-обёртки для ссылок на методы только ради отрицания.
Компонуемый
Работает с любым Predicate и позволяет строить чистые цепочки предикатов.
Естественно читаемый
Predicate.not(String::isBlank) читается как естественный язык.
Старый подход
Отрицание через лямбду
Современный подход
Predicate.not()
Начиная с JDK
11
Сложность
Начинающий
Поддержка JDK
Predicate.not() для отрицания
Доступно
Доступно с JDK 11 (сентябрь 2018).
Как это работает
До Java 11 для отрицания ссылки на метод требовалась её обёртка в лямбду. Predicate.not() позволяет напрямую отрицать любой предикат, что делает код читаемым и согласованным со стилем ссылок на методы во всём пайплайне Stream.
Связанная документация
Доказательство