如何否定方法引用谓词

新手上路,请多包涵

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

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

有没有一种方法可以创建一个方法引用来否定现有的方法引用,例如:

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

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

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

原文由 assylias 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 321
2 个回答

Predicate.not( … )

java-11 提供了一种新方法 Predicate#not

所以你可以否定方法引用:

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

原文由 Anton Balaniuc 发布,翻译遵循 CC BY-SA 4.0 许可协议

我打算静态导入以下内容以允许内联使用方法引用:

 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 也提供了 类似的内置解决方案

原文由 davidillsley 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题