Недавно состоялось интересное обсуждение использования отрицания предикатов в методе .filter в потоке членами списка рассылки LJC , поэтому я подумал, что стоило бы кратко изложить это в сообщении в блоге. Обсуждение было о том, как использовать .filter и отрицать предикат.
- Код для этого поста доступен в моем аккаунте на github .
Это, возможно, то, как вы могли бы думать о выполнении, но вот несколько альтернативных способов
|
1
2
|
Stream.of(1, 2, 3, 4, 5, 6, 7) .filter(((Predicate) c -> c % 2 == 0).negate()) |
Ответ 1: написать метод предиката
Вы можете упростить это, написав служебный метод, который выполняет отрицание.
|
1
2
3
|
public static <R> Predicate<R> not(Predicate<R> predicate) { return predicate.negate();} |
Что приводит к гораздо более аккуратному коду.
|
1
2
|
Stream.of(1, 2, 3, 4, 5, 6, 7) .filter(not(c -> c % 2 == 0)) |
Ответ 2. Используйте функцию идентификации для преобразования ссылки на метод в предикат
Мы используем служебный метод для преобразования ссылки на метод в предикат.
|
1
2
3
|
public static <T> Predicate<T> predicate(Predicate<T> predicate) { return predicate;} |
хотя код не такой аккуратный.
|
1
2
|
Stream.of("Cat", "", "Dog") .filter(predicate(String::isEmpty).negate()) |
- Список литературы: Принцип Хайнца Лямбда Сокращения
Ответ 3: используйте оператор not (!)
Используйте знакомый не оператор.
|
1
2
3
4
5
|
Stream.of(1, 2, 3, 4, 5, 6, 7) .filter((c -> c % 2 != 0))Stream.of("Cat", "", "Dog") .filter(str -> !str.isEmpty()) |
Код намного проще и сразу знаком.
Утверждается, что ссылки на методы часто сложнее читать и сложнее при рефакторинге, чем простые лямбды, и что смешение лямбд и ссылок на методы в цепочке потоков вводит читателя в заблуждение. Ссылка: Java SE 8 Best Practices
Когда вы используете ссылку на метод и хотите, чтобы среда IDE создала метод, IntelliJ создает его как статический метод с объектом в качестве первого аргумента. Использование оператора not позволяет избежать этого.
Вот несколько полезных ссылок:
- Java 8 Lambdas: функциональное программирование для масс
- Java SE 8 Best Practices
- Хайнц-принцип лямбда-редукции
- Список рассылки LJC
- Ссылки на методы имеют ошибку в некоторых версиях JDK
| Ссылка: | Java 8 Streams: отфильтруйте и отрицайте отрицание от нашего партнера по JCG Алекса Тидома из блога alex.theedom . |