【问题标题】:How can I negate a lambda Predicate?如何否定 lambda 谓词?
【发布时间】:2015-01-30 12:16:41
【问题描述】:
假设我有一个字符串流。
final Stream<String> stream = ...;
我想在修剪后过滤掉每个空字符串。
stream
.filter(Objects::nonNull)
.map(String::trim)
.filter(v -> !v.isEmpty());
有没有办法申请Predicate#negate() 替换v -> !v.isEmpty() 部分?
.filter(((Predicate) String::isEmpty).negate()) // not compile
【问题讨论】:
标签:
java
lambda
java-8
predicate
【解决方案1】:
你必须这样做.filter(((Predicate<String>) String::isEmpty).negate())
如果你愿意,你可以定义
static<T> Predicate<T> not(Predicate<T> p) {
return t -> !p.test(t);
}
然后
.filter(not(String::isEmpty))
但我会坚持使用v -> !v.isEmpty()
【解决方案2】:
看来您必须强制转换为 Predicate<String> 才能使其工作:
.filter(((Predicate<String>) (String::isEmpty)).negate())
当然,在这种情况下使用 lambda 会更短:
.filter(s -> ! s.isEmpty())
【解决方案3】:
不要自己创建类,而是使用durian 实用程序库。当然有很多methods:and、or和not:
import static com.diffplug.common.base.Predicates.not;
stream
.filter(Objects::nonNull)
.map(String::trim)
.filter(not(String::isEmpty));