Java:允许对lambda表达式进行逻辑和运算(&&)?

时间:2018-07-30 13:26:18

标签: java lambda

我深入研究Java源代码并发现了这一点:

文件:Predicate.java。(java.util.functions包中的Predicate接口)

default Predicate<T> and(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) && other.test(t);//logic and lambda expression and boolean expression??
}
default Predicate<T> negate() {
    return (t) -> !test(t);//I understand this, it returned a lambda expression.
}

那么return (t) -> test(t) && other.test(t)是什么意思?实际上,我可能知道这意味着什么。但是我只是想知道lambda表达式类型是否允许此操作?请指出语法和语法参考。

谢谢!

4 个答案:

答案 0 :(得分:1)

它返回一个Predicate,它首先调用其test方法(通过一个隐式this),并在需要时使用other.test方法... Predicate具有定义的test方法-唯一的一个摘要。

答案 1 :(得分:1)

default Predicate<T> and(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return (t) -> {return test(t) && other.test(t);};
}

请注意,为了简洁起见,可以将括号删除。

令我困惑的是,我错误地将代码return (t) -> test(t) && other.test(t);解析为lambda表达式(t) -> test(t)逻辑和other.test(t)。所以我问了有关类型和操作的问题。

答案 2 :(得分:1)

您几乎在问“ lambda表达式如何允许逻辑和(&&)”。

首先,方法and具有功能(return (t) -> test(t) && other.test(t);,如方法文档中所述。

  

返回表示短路的组合谓词   此谓词与另一个谓词的逻辑与。

对于上述问题,Predicate<T>表示一个函数,类型为T,并且返回布尔值,因为test(t)other.test(t)返回 boolean ,使用逻辑和(&&)运算符是完全可以接受的。

答案 3 :(得分:0)

Lambda可能很难阅读,特别是如果您不熟悉它们。有时它有助于将其扩展为非lambda。学习lambda时,我必须先编写完整的匿名类实现,然后将其简化为lambda。如果有帮助,这就是没有lambda的情况下粘贴的代码的样子。

default Predicate<T> and(Predicate<? super T> other) {
    Objects.requireNonNull(other);
    return new Predicate<T>() {
        public boolean test(T t) {
            return this.test(t) && other.test(t);
        }
    };
}

default Predicate<T> negate() {
    return new Predicate<T>() {
        public boolean test(T t) {
            return !this.test(t);
        }
    };
}