我如何否定lambda谓词?

时间:2015-01-30 12:16:41

标签: java lambda java-8 predicate

假设我有一串字符串。

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

3 个答案:

答案 0 :(得分:28)

您必须.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()

答案 1 :(得分:7)

似乎你必须强制转换为Predicate<String>才能使其工作:

.filter(((Predicate<String>) (String::isEmpty)).negate())

当然,在这种情况下使用lambda会短得多:

.filter(s -> ! s.isEmpty())

答案 2 :(得分:2)

不要自己创建类,而是使用durian实用程序库。它当前有很多methodsandornot

import static com.diffplug.common.base.Predicates.not;

stream
.filter(Objects::nonNull)
.map(String::trim)
.filter(not(String::isEmpty));