Существует способ составить ссылку на метод, противоположную текущей ссылке на метод. См. Ответ @ vlasec ниже, который показывает, как явным образом привести ссылку на метод к a, Predicate
а затем преобразовать ее с помощью negate
функции. Это один из нескольких других не слишком хлопотных способов сделать это.
Противоположность этому:
Stream<String> s = ...;
int emptyStrings = s.filter(String::isEmpty).count();
это:
Stream<String> s = ...;
int notEmptyStrings = s.filter(((Predicate<String>) String::isEmpty).negate()).count()
или это:
Stream<String> s = ...;
int notEmptyStrings = s.filter( it -> !it.isEmpty() ).count();
Лично я предпочитаю более позднюю технику, потому что нахожу более понятным, it -> !it.isEmpty()
чем длинное подробное явное приведение, а затем отрицание.
Можно также сделать предикат и использовать его повторно:
Predicate<String> notEmpty = (String it) -> !it.isEmpty();
Stream<String> s = ...;
int notEmptyStrings = s.filter(notEmpty).count();
Или, если есть коллекция или массив, просто используйте цикл for, который прост, имеет меньше накладных расходов, а * может быть ** быстрее:
int notEmpty = 0;
for(String s : list) if(!s.isEmpty()) notEmpty++;
* Если вы хотите знать, что быстрее, то используйте JMH http://openjdk.java.net/projects/code-tools/jmh и избегайте ручного кода тестов, если он не избегает всех оптимизаций JVM - см. Java 8: производительность потоков против коллекций
** Я получаю злость за предположение, что техника цикла for работает быстрее. Это исключает создание потока, исключает использование другого вызова метода (отрицательная функция для предиката) и устраняет временный список / счетчик аккумулятора. Итак, несколько вещей, которые сохраняются последней конструкцией, могут сделать ее быстрее.
Я думаю, что это проще и приятнее, хотя и не быстрее. Если работа требует молотка и гвоздя, не вводите бензопилу и клей! Я знаю, что некоторые из вас не согласны с этим.
список желаний: я хотел бы видеть, что Stream
функции Java развиваются немного теперь, когда пользователи Java более знакомы с ними. Например, метод 'count' в Stream может принять a, Predicate
чтобы это можно было сделать прямо так:
Stream<String> s = ...;
int notEmptyStrings = s.count(it -> !it.isEmpty());
or
List<String> list = ...;
int notEmptyStrings = lists.count(it -> !it.isEmpty());
Predicate.not(Predicate)
метода. Но эта проблема все еще открыта, поэтому мы увидим это в ближайшее время в Java 12 (если вообще когда-либо).