【问题标题】: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 -&gt; !v.isEmpty() 部分?

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

【问题讨论】:

    标签: java lambda java-8 predicate


    【解决方案1】:

    你必须这样做.filter(((Predicate&lt;String&gt;) String::isEmpty).negate())

    如果你愿意,你可以定义

    static<T> Predicate<T> not(Predicate<T> p) {
        return t -> !p.test(t);
    }
    

    然后

    .filter(not(String::isEmpty))
    

    但我会坚持使用v -&gt; !v.isEmpty()

    【讨论】:

    • 你也可以return p.negate();
    【解决方案2】:

    看来您必须强制转换为 Predicate&lt;String&gt; 才能使其工作:

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

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

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

    【讨论】:

      【解决方案3】:

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

      import static com.diffplug.common.base.Predicates.not;
      
      stream
      .filter(Objects::nonNull)
      .map(String::trim)
      .filter(not(String::isEmpty));
      

      【讨论】:

        猜你喜欢
        • 2023-02-10
        • 2014-02-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多