java8 streams
最近,有关LJC 邮件列表的成员在流中.filter方法中使用谓词否定的有趣讨论,因此我认为值得在博客文章中进行总结。 讨论是关于使用.filter和否定谓词的方法。
- 这篇文章的代码可以在我的github帐户中找到 。
也许这就是您可能会想到的方式,但是这里有一些替代方法。
Stream.of(1, 2, 3, 4, 5, 6, 7).filter(((Predicate) c -> c % 2 == 0).negate())
答案1:编写谓词实用程序方法
您可以通过编写执行取反的实用程序方法来简化此操作。
public static <R> Predicate<R> not(Predicate<R> predicate) {return predicate.negate();
}
这样可以使代码更加整洁。
Stream.of(1, 2, 3, 4, 5, 6, 7).filter(not(c -> c % 2 == 0))
- 在github上查看源代码
答案2:使用标识函数将方法引用转换为谓词
我们使用实用程序方法将方法引用转换为谓词。
public static <T> Predicate<T> predicate(Predicate<T> predicate) {return predicate;
}
尽管代码不是那么整洁。
Stream.of("Cat", "", "Dog").filter(predicate(String::isEmpty).negate())
- 参考资料: 亨氏的Lambda减少原理
答案3:使用not(!)运算符
使用熟悉的not运算符。
Stream.of(1, 2, 3, 4, 5, 6, 7).filter((c -> c % 2 != 0))Stream.of("Cat", "", "Dog").filter(str -> !str.isEmpty())
该代码更简单,并且立即熟悉。
有人争辩说,方法引用在重构时通常比简单的lambda难于阅读,并且比较棘手,并且流链中混合lambda和方法引用会使读者感到困惑。 参考: Java SE 8最佳实践
当您使用方法引用并希望IDE创建该方法时, IntelliJ会将其创建为静态方法,并将对象作为第一个参数。 使用not运算符可以避免这种情况。
以下是一些有用的参考:
- Java 8 Lambdas:面向大众的函数式编程
- Java SE 8最佳实践
- 亨氏的Lambda减少原理
- LJC邮件列表
- 方法引用在某些JDK版本中存在错误
翻译自: https://www.javacodegeeks.com/2015/11/java-8-streams-filter-and-predicate-negation.html
java8 streams