这是一个以谓词为参数的示例方法:void processFields(List<WebDataField> fields, Predicate<WebDataField> predicate) { for (WebDataField webDataField : fields) { boolean expectedCondition = predicate.test(webDataField); }}我将上述函数称为:processFields(fields, w -> w.getFieldName().length() > 5);另一个功能:public void doSomething(Object someObject,Predicate<T> predicateInstance){ //doSomething method's code goes here}在调用方,方法doSomething()将像这样被调用–doSomething(someObjectInstance, Integer i-> i>10)我检查了Java 8文档中的String / Integer / Object等,但没有发现实现Predicate<T>接口的这些类中的任何一个。我不知道我在Java 8教程系列中错过了什么,但是我无法得到这种现象:如果目标类型与Predicate类没有直接关系,编译器如何允许lambda表达式?上述两种情况的答案是否相同?
2 回答
狐的传说
TA贡献1804条经验 获得超3个赞
lambda表达式的(Integer i) -> i>1
值不是Integer
,因此Integer
不必实现Predicate
即可将该lambda表达式传递给您的方法。
Integer
是i
lambda表达式的参数类型。(Integer i) -> i>1
可以表示具有单个方法的任何功能接口,该方法带有一个Integer
参数并返回boolean
。因此,它适合Predicate<Integer>
功能接口。
您的另一个lambda表达式--w -> w.getFieldName().length() > 5
接受未指定类型的参数,并返回boolean
。为了使其能够通过编译,编译器必须推断类型为w
具有getFieldName()
方法的某个类或接口,该类或接口将返回具有方法的某种类型的实例length()
。当您将lambda表达式传递给processFields
需要a的方法时,Predicate<WebDataField>
编译器可以推断出lambda表达式的参数类型w
为WebDataField
。
添加回答
举报
0/150
提交
取消