Вебинары Разобраться в IT Реферальная программа
Программирование Аналитика Дизайн Маркетинг Управление проектами
7 профессий по цене одной
07:05:47:06
дн. ч. мин. сек.
11 Сен 2024
2 мин
76

Отрицание ссылки на метод в предикате в Java 8

В Java 8 появилась возможность использовать ссылки на методы для фильтрации потоков. Это удобная функциональность, которая значительно упрощает работу

В 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, данную задачу можно решить, написав небольшую вспомогательную функцию. Это позволит продолжать пользоваться удобством и выразительностью ссылок на методы, не теряя в гибкости.

Проверь как ты усвоил материалы статьи
Пройди тест и узнай насколько ты лучше других читателей

Добавить комментарий