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

4
我想知道为什么方法引用和Lambda表达式不能被识别为函数。为什么我需要编写:

Function<T,R> f = x -> myMethod(x);

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)
1个回答

12
Lambda表达式没有固有类型;以下代码是错误的:
Object lambda = x -> x;

Lambda表达式是多态表达式,其类型取决于上下文。特别地,Lambda表达式从其目标类型中派生其类型,这个目标类型必须是一个函数式接口——一个带有单一(非Object)抽象方法的接口。同一个Lambda表达式可以具有多个类型,这取决于它的目标类型:

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

Function 接口并非语言的一部分,也没有任何神奇的属性;它仅仅是一个普通的函数式接口,就像 RunnablePredicateComparable 一样。编译器无法猜测你想把 lambda 表达式应用于哪种类型,可能不只是 Function

另外,你不必使用 lambda 实现 Function;你可以使用具名类或匿名类。Lambda 表达式(和方法引用)是指定函数式接口实例的语法紧凑的手段。


有道理。谢谢你的解释 :) - Julian Rubin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接