Java 8 Streams:过滤和谓词否定

最近,有关LJC 邮件列表的成员在流中.filter方法中使用谓词否定的有趣讨论,因此我认为值得在博客文章中进行总结。 讨论的主题是使用.filter和否定谓词的方法。

也许这就是您可能会想到的方式,但是这里有一些替代方法。

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))

答案2:使用标识函数将方法引用转换为谓词

我们使用实用程序方法将方法引用转换为谓词。

public static <T> Predicate<T> predicate(Predicate<T> predicate) {
      return predicate;
}

尽管代码不是那么整洁。

Stream.of("Cat", "", "Dog")
      .filter(predicate(String::isEmpty).negate())

答案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运算符可以避免这种情况。

以下是一些有用的参考:

翻译自: https://www.javacodegeeks.com/2015/11/java-8-streams-filter-and-predicate-negation.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值