В Java 8 появилась возможность использовать ссылки на методы для фильтрации потоков. Это удобная функциональность, которая значительно упрощает работу с потоками данных.
Возьмем, к примеру, поток строк. Часто перед нами стоит задача подсчета пустых строк в данном потоке. Это можно сделать, используя метод filter
и ссылку на метод isEmpty
класса String
:
Stream<String> s = ...; // ваш поток данных long emptyStrings = s.filter(String::isEmpty).count();
Но что, если перед нами стоит задача подсчета непустых строк? Можно ли как-то инвертировать условие предиката, чтобы отфильтровать поток по отрицанию данного условия?
К сожалению, стандартный набор средств JDK не предлагает прямого решения для этой задачи. Попытка применить оператор отрицания (!
) к ссылке на метод приведет к ошибке компиляции.
Однако, можно создать функцию, которая будет возвращать предикат, являющийся отрицанием переданного ей предиката. Например, так:
static <T> Predicate<T> not(Predicate<T> p) { return o -> !p.test(o); }
Этот метод принимает предикат p
и возвращает новый предикат, который возвращает обратное значение при применении к объекту o
.
Теперь, имея такой метод, можно легко подсчитать количество непустых строк в потоке:
long nonEmptyStrings = s.filter(not(String::isEmpty)).count();
Подводя итог, можно сказать, что, несмотря на отсутствие встроенных средств для создания отрицания ссылок на методы в Java 8, данную задачу можно решить, написав небольшую вспомогательную функцию. Это позволит продолжать пользоваться удобством и выразительностью ссылок на методы, не теряя в гибкости.
Добавить комментарий