如何否定方法引用谓词Predicate.not( … )

2022-08-31 04:34:16

在 Java 8 中,可以使用方法引用来过滤流,例如:

Stream<String> s = ...;
long emptyStrings = s.filter(String::isEmpty).count();

有没有办法创建一个方法引用,它是对现有方法的否定,即类似的东西:

long nonEmptyStrings = s.filter(not(String::isEmpty)).count();

我可以创建如下方法,但我想知道JDK是否提供了类似的东西。not

static <T> Predicate<T> not(Predicate<T> p) { return o -> !p.test(o); }

答案 1

Predicate.not( … )

提供了一个新方法谓词#not

因此,您可以否定方法引用:

Stream<String> s = ...;
long nonEmptyStrings = s.filter(Predicate.not(String::isEmpty)).count();

答案 2

我计划静态导入以下内容,以允许内联使用方法引用:

public static <T> Predicate<T> not(Predicate<T> t) {
    return t.negate();
}

例如:

Stream<String> s = ...;
long nonEmptyStrings = s.filter(not(String::isEmpty)).count();

更新:从Java-11开始,JDK也提供了类似的内置解决方案


推荐