如何否定 lambda 谓词?

2022-09-01 11:55:39

假设我有一个字符串流。

final Stream<String> stream = ...;

我想在修剪后过滤掉每个空字符串。

stream
    .filter(Objects::nonNull)
    .map(String::trim)
    .filter(v -> !v.isEmpty());

有没有办法应用谓词#negate()来替换部件?v -> !v.isEmpty()

.filter(((Predicate) String::isEmpty).negate()) // not compile

答案 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())

推荐