java - JDK8 谓词函数接口(Predicate)源码疑问?
问题描述
函数接口中有一个 and() 方法,源码如下
default Predicate<T> and(Predicate<? super T> other) { Objects.requireNonNull(other); return (t) -> test(t) && other.test(t);}
另外,test()源码如下
boolean test(T t);
疑问就是为什么 &&与boolean类型值做逻辑运算可以返回一个谓词对象???
问题解答
回答1:我不知道什么叫谓词对象,但 test(t) && other.test(t) 这就是一个普通的 boolean 表达式,返回的就是一个 boolean 的值,不是什么 “谓词对象”。整条 return 语句实际上是下面语句的简写:
return (t) -> { return test(t) && other.test(t);};回答2:
返回的不是boolean, 而是(t) -> { return true|false; }, 表示返回一个functional interface, 这个functional interface是什么根据上下文确定, 只要是接受参数是1个并且返回值是bool都可以, 在Predicate中就是functional interface自己, 因为方法规定了返回值是Predicate.
回答3:@捏造的信仰 和 @YaTou 都说了,返回的是一个 Lambda,符合 Predicate<T> 的定义。
我只想说,Predicate 为什么会翻译成“谓词”,虽然它有“谓语”这个意思,但是在这里用的是它的另一个意思“断言,断定(自然语言中用断定比较好懂,但开发技术书一般称为断言)”,用于判断某个东西,得到 true 或 false 的结果——也就是断定为真,或断定为假
回答4:确实源码是没有问题的,是我自己现在入为主了,将 (t) -> test(t)当做一个整体了,其实应该 test(t) && other.test(t)是一个整体,谢谢 @捏造的信仰 和 @YaTou 的回答以及边城大大的提醒
相关文章:
1. MySQL 水平拆分之后,自动增长的ID有什么好的解决办法?2. 编辑管理员信息时,为什么没有修改过的内容会为空?3. javascript - 请问一下react-native 布局的时候,尺寸的大小是如何确定的呢?4. css3不包括5. javascript - js中数组的undefined为什么不会被遍历6. javascript - 如何将一个长为365的数组对象按月份切割成12组?7. 求救一下,用新版的phpstudy,数据库过段时间会消失是什么情况?8. node.js - vue项目在c盘外,npm run dev 出错,求指点。9. thinkphp中Controller里面使用Request::File(’image’);10. html - echarts如何自定义tooltip

网公网安备