這是一個以謂詞為參數(shù)的示例方法:void processFields(List<WebDataField> fields, Predicate<WebDataField> predicate) { for (WebDataField webDataField : fields) { boolean expectedCondition = predicate.test(webDataField); }}我將上述函數(shù)稱為:processFields(fields, w -> w.getFieldName().length() > 5);另一個功能:public void doSomething(Object someObject,Predicate<T> predicateInstance){ //doSomething method's code goes here}在調(diào)用方,方法doSomething()將像這樣被調(diào)用–doSomething(someObjectInstance, Integer i-> i>10)我檢查了Java 8文檔中的String / Integer / Object等,但沒有發(fā)現(xiàn)實現(xiàn)Predicate<T>接口的這些類中的任何一個。我不知道我在Java 8教程系列中錯過了什么,但是我無法得到這種現(xiàn)象:如果目標(biāo)類型與Predicate類沒有直接關(guān)系,編譯器如何允許lambda表達(dá)式?上述兩種情況的答案是否相同?
2 回答

狐的傳說
TA貢獻1804條經(jīng)驗 獲得超3個贊
lambda表達(dá)式的(Integer i) -> i>1
值不是Integer
,因此Integer
不必實現(xiàn)Predicate
即可將該lambda表達(dá)式傳遞給您的方法。
Integer
是i
lambda表達(dá)式的參數(shù)類型。(Integer i) -> i>1
可以表示具有單個方法的任何功能接口,該方法帶有一個Integer
參數(shù)并返回boolean
。因此,它適合Predicate<Integer>
功能接口。
您的另一個lambda表達(dá)式--w -> w.getFieldName().length() > 5
接受未指定類型的參數(shù),并返回boolean
。為了使其能夠通過編譯,編譯器必須推斷類型為w
具有getFieldName()
方法的某個類或接口,該類或接口將返回具有方法的某種類型的實例length()
。當(dāng)您將lambda表達(dá)式傳遞給processFields
需要a的方法時,Predicate<WebDataField>
編譯器可以推斷出lambda表達(dá)式的參數(shù)類型w
為WebDataField
。
添加回答
舉報
0/150
提交
取消