我如何否定lambda谓词?

Jin*_*won 27 java lambda predicate java-8

假设我有一串字符串.

final Stream<String> stream = ...;
Run Code Online (Sandbox Code Playgroud)

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

stream
    .filter(Objects::nonNull)
    .map(String::trim)
    .filter(v -> !v.isEmpty());
Run Code Online (Sandbox Code Playgroud)

有没有办法应用Predicate#negate()替换v -> !v.isEmpty()部分?

.filter(((Predicate) String::isEmpty).negate()) // not compile
Run Code Online (Sandbox Code Playgroud)

Mis*_*sha 29

你必须这样做 .filter(((Predicate<String>) String::isEmpty).negate())

如果需要,您可以定义

static<T> Predicate<T> not(Predicate<T> p) {
    return t -> !p.test(t);
}
Run Code Online (Sandbox Code Playgroud)

然后

.filter(not(String::isEmpty))
Run Code Online (Sandbox Code Playgroud)

但我会坚持下去 v -> !v.isEmpty()

  • 你也可以`return p.negate();` (17认同)

tob*_*s_k 7

看起来你必须Predicate<String>为此付出代价:

.filter(((Predicate<String>) (String::isEmpty)).negate())
Run Code Online (Sandbox Code Playgroud)

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

.filter(s -> ! s.isEmpty())
Run Code Online (Sandbox Code Playgroud)