Java 8谓词

这是一个以谓词为参数的示例方法:


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表达式?


上述两种情况的答案是否相同?


千万里不及你
浏览 122回答 2
2回答

狐的传说

lambda表达式的(Integer i) -> i>1值不是Integer,因此Integer不必实现Predicate即可将该lambda表达式传递给您的方法。Integer是ilambda表达式的参数类型。(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。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java