java - JDK8 謂詞函數(shù)接口(Predicate)源碼疑問(wèn)?
問(wèn)題描述
函數(shù)接口中有一個(gè) and() 方法,源碼如下
default Predicate<T> and(Predicate<? super T> other) { Objects.requireNonNull(other); return (t) -> test(t) && other.test(t);}
另外,test()源碼如下
boolean test(T t);
疑問(wèn)就是為什么 &&與boolean類(lèi)型值做邏輯運(yùn)算可以返回一個(gè)謂詞對(duì)象???
問(wèn)題解答
回答1:我不知道什么叫謂詞對(duì)象,但 test(t) && other.test(t) 這就是一個(gè)普通的 boolean 表達(dá)式,返回的就是一個(gè) boolean 的值,不是什么 “謂詞對(duì)象”。整條 return 語(yǔ)句實(shí)際上是下面語(yǔ)句的簡(jiǎn)寫(xiě):
return (t) -> { return test(t) && other.test(t);};回答2:
返回的不是boolean, 而是(t) -> { return true|false; }, 表示返回一個(gè)functional interface, 這個(gè)functional interface是什么根據(jù)上下文確定, 只要是接受參數(shù)是1個(gè)并且返回值是bool都可以, 在Predicate中就是functional interface自己, 因?yàn)榉椒ㄒ?guī)定了返回值是Predicate.
回答3:@捏造的信仰 和 @YaTou 都說(shuō)了,返回的是一個(gè) Lambda,符合 Predicate<T> 的定義。
我只想說(shuō),Predicate 為什么會(huì)翻譯成“謂詞”,雖然它有“謂語(yǔ)”這個(gè)意思,但是在這里用的是它的另一個(gè)意思“斷言,斷定(自然語(yǔ)言中用斷定比較好懂,但開(kāi)發(fā)技術(shù)書(shū)一般稱(chēng)為斷言)”,用于判斷某個(gè)東西,得到 true 或 false 的結(jié)果——也就是斷定為真,或斷定為假
回答4:確實(shí)源碼是沒(méi)有問(wèn)題的,是我自己現(xiàn)在入為主了,將 (t) -> test(t)當(dāng)做一個(gè)整體了,其實(shí)應(yīng)該 test(t) && other.test(t)是一個(gè)整體,謝謝 @捏造的信仰 和 @YaTou 的回答以及邊城大大的提醒
相關(guān)文章:
1. 點(diǎn)擊頁(yè)面就自動(dòng)輸入到mysql.求解2. java - IDEA從SVN檢出項(xiàng)目 并在tomcat上運(yùn)行 求詳細(xì)流程3. node.js - nodejs使用formidable上傳文件問(wèn)題4. javascript - windos下第一次用Django無(wú)法正確創(chuàng)建工程目錄5. node.js - 帶有node_modules目錄的項(xiàng)目,用phpstorm打開(kāi)速度極慢,怎么解決?6. java - 多叉樹(shù)求值,程序高手,算法高手看過(guò)來(lái)7. css - 請(qǐng)問(wèn)B站頂部的模糊半透明導(dǎo)航條是怎么實(shí)現(xiàn)的呢?8. android - 安卓做前端,PHP做后臺(tái)服務(wù)器 有什么需要注意的?9. javascript - 微信小程序在wx:for循環(huán)里判斷數(shù)據(jù)再給類(lèi)名,條件為動(dòng)態(tài)時(shí)無(wú)效10. html5 - 有人做過(guò)防微信app界面的H5 demo嗎?
