java - JDK8 謂詞函數(shù)接口(Predicate)源碼疑問?
問題描述
函數(shù)接口中有一個 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是什么根據(jù)上下文確定, 只要是接受參數(shù)是1個并且返回值是bool都可以, 在Predicate中就是functional interface自己, 因為方法規(guī)定了返回值是Predicate.
回答3:@捏造的信仰 和 @YaTou 都說了,返回的是一個 Lambda,符合 Predicate<T> 的定義。
我只想說,Predicate 為什么會翻譯成“謂詞”,雖然它有“謂語”這個意思,但是在這里用的是它的另一個意思“斷言,斷定(自然語言中用斷定比較好懂,但開發(fā)技術書一般稱為斷言)”,用于判斷某個東西,得到 true 或 false 的結果——也就是斷定為真,或斷定為假
回答4:確實源碼是沒有問題的,是我自己現(xiàn)在入為主了,將 (t) -> test(t)當做一個整體了,其實應該 test(t) && other.test(t)是一個整體,謝謝 @捏造的信仰 和 @YaTou 的回答以及邊城大大的提醒
相關文章:
1. android - weex 項目createInstanceReferenceError: Vue is not defined2. pdo 寫入到數(shù)據(jù)庫的內(nèi)容為中文的時候寫入亂碼3. PHPExcel表格導入數(shù)據(jù)庫怎么導入4. android - 哪位大神知道java后臺的api接口的對象傳到前端后輸入日期報錯,是什么情況?求大神指點5. javascript - 如圖,百度首頁,查看源代碼為什么什么都沒有?6. vue2.0+webpack 如何使用bootstrap?7. PHP類封裝的插入數(shù)據(jù),總是插入不成功,返回false;8. mac連接阿里云docker集群,已經(jīng)卡了2天了,求問?9. javascript - 前端開發(fā)框架express,在他的模板引擎下怎么給按鈕添加綁定事件?10. python - 小白django提交數(shù)據(jù)后,沒有存儲到數(shù)據(jù)庫(查閱資料并沒有發(fā)現(xiàn)問題)
