Где можно использовать методы Predicate?

212
06 мая 2018, 21:28

Интересуют случаи где можно применить negate, and и or. Ну и к тому же не пойму в общем как они работают. Объясните пожалуйста.

Answer 1

Предположим у вас есть предикат, который единожды сохранён в переменную и используется во многих участках кода. Для простоты возьмём ссылку на метод isEmpty класса String, проверяющий строку на пустоту:

Predicate<String> isEmpty = String::isEmpty;

Но в одних участках кода надо использовать его для нахождения пустых строк, а в других наоборот непустых. Например, вы считали из файла строки и хотите отбросить пустые:

Files.lines(Paths.get(fileName))
     .filter(isEmpty.negate())
     ...

Без метода negate вам пришлось бы использовать более многословную и менее идиоматичную конструкцию с дополнительной лямбдой:

Files.lines(Paths.get(fileName))
     .filter(s -> !isEmpty.test(s))
     ...

Повторюсь, isEmpty используется только для примера. Тут мог бы быть какой-нибудь нестандартный и более сложный предикат.

Методы or и and позволяют объединять предикаты, благодаря чему можно, например, в одной операции filter выполнить цепочку проверок. Вот пример из моего другого ответа, динамический конструирующий предикат из набора заранее неизвестных условий:

Predicate<Entity> p = Arrays.stream(flags)
                            .map(f -> e -> (f & e.getFlags()) > 0)
                            .reduce(Predicate::or)
                            .orElse(t -> false);
data.stream()
    .filter(p)
    .collect(Collectors.toList());
READ ALSO
Обработка нажатий на Actor в libgdx

Обработка нажатий на Actor в libgdx

Как лучше узнать, было ли нажатие на какого-то актёра в libgdx

242
Исключение InetAdress.getLocalHost() - UnknownHost

Исключение InetAdress.getLocalHost() - UnknownHost

Мне нужно получить адрес устройства, но этот метод отказывается работать, кидая исключенияВсе, что я смог нагуглить, это надо что-то записать...

240
Задан файл целых чисел. Указать диапазон, в котором находятся его элементы

Задан файл целых чисел. Указать диапазон, в котором находятся его элементы

Смог сделать данную задачу не считывая данные с файла, а случайными числами

254
Выполнить команду командной строки на Java

Выполнить команду командной строки на Java

Я запускаю программу при помощи командной строки следующим образом:

204