我深入研究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表达式类型是否允许此操作?请指出语法和语法参考。
谢谢!
答案 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);
}
};
}