Java 8中方法引用和lambda的类型

朱利安·鲁宾(Julian Rubin)

我想知道为什么方法引用和lambda无法识别为功能。为什么我需要写

Function<Integer, Integer> fun1 = i -> i+2;
Function<Integer, Integer> fun2 = i -> i*i;
fun1.compose(fun2).apply(4);

代替

((Integer i) -> i*2).compose((Integer i) -> i+2).apply(4)
布莱恩·格茨

Lambda表达式没有内部类型。以下是错误:

Object lambda = x -> x;

Lambda表达式是poly表达式,是类型取决于其上下文的表达式。特别是,lambda表达式从其目标类型派生其类型,该目标类型必须是功能接口-具有单个(非Object)抽象方法的接口相同的lambda表达式可以具有多种类型,具体取决于其目标类型:

Predicate<String> isEmpty = s -> s.isEmpty();
Function<String, Boolean> isEmpty = s -> s.isEmpty();

接口Function不是语言的一部分,也不具有任何魔术特性;它只是一个普通的功能接口,就像RunnableorPredicate或or一样Comparable编译器没有理由没有猜测到您的意思是要针对的lambda,Function而不是其他类型。

此外,您无需成为lambda即可实现Function您可以是命名类或匿名类。Lambda(和方法ref)是指定功能接口实例的语法紧凑方式。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章