繁体   English   中英

将lambda作为参数传递给泛型类型-Java 8

[英]Passing lambda as parameter with generic type - java 8

如果我有一个方法foo(Predicate bar) ,则可以在下一个使用它:

foo(new Predicate<MyObject>() {
        public boolean apply(MyObject obj) { 
           return true;
        }
    }
)

但是如何使用lambda样式的表达式达到相同的结果:

foo((MyObject obj) -> true); //obvious compile exception

如何将带有lambda的泛型类型传递给方法? 或者,简单地讲,如何使用不带局部变量的lambda样式创建Predicate(或其他)类的匿名对象。

不要使用原始类型foo(Predicate<? extends MyObject> bar)

或在Lambda foo(obj -> ((MyObject) obj).myMethod())

如果您的目标类型是原始类型,例如在调用foo(Predicate bar) ,您就无法期望lambda表达式能够为您神奇地生成适当的类型。 它与匿名内部类一起使用,因为该声明具有显式类型( Predicate<MyObject> {} ),该类型可以通过不安全的操作传递给Predicate 但是lambda表达式没有类型。 它们被转换为目标类型,在您的调用中,目标类型为Predicate

如果要通过lambda表达式创建Predicate<MyObject> ,则需要Predicate<MyObject>作为目标类型:

Predicate<MyObject> p = o -> /* note that o has the type MyObject */true;
foo(p);

要么

foo((Predicate<MyObject>)o -> /* here, o has the type MyObject as well*/true);

要么

void fooHelper(Predicate<MyObject> p) {
    foo(p);
}
…
fooHelper(o -> /* here, o has again the type MyObject*/true);

当然,在所有这些情况下,您也可以编写(MyObject o) -> true ,但是此参数的显式声明对使用此lambda表达式创建的实例的类型没有影响。

请注意,第二个变体具有类型转换的形式结构,但是在运行时不会进行类型转换操作。 它仅用于指定lambda表达式的目标类型(类似于加宽用于在方法调用中选择特定重载的转换)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM