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

Methods Java 8中方法引用和lambda的类型,methods,types,lambda,java-8,Methods,Types,Lambda,Java 8,我想知道为什么方法引用和lambda不能被识别为函数。为什么我需要写作 Function<Integer, Integer> fun1 = i -> i+2; Function<Integer, Integer> fun2 = i -> i*i; fun1.compose(fun2).apply(4); Lambda表达式没有内在类型;以下是一个错误: Object lambda = x -> x; Lambda表达式是多边形表达式,其类型取决于上下

我想知道为什么方法引用和lambda不能被识别为函数。为什么我需要写作

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

Lambda表达式没有内在类型;以下是一个错误:

Object lambda = x -> x;
Lambda表达式是多边形表达式,其类型取决于上下文。特别是,lambda表达式从其目标类型派生其类型,目标类型必须是一个函数接口——一个具有单个(非
对象
)抽象方法的接口。同一lambda表达式可以有多种类型,具体取决于其目标类型:

Predicate<String> isEmpty = s -> s.isEmpty();
Function<String, Boolean> isEmpty = s -> s.isEmpty();
谓词isEmpty=s->s.isEmpty();
函数isEmpty=s->s.isEmpty();
接口
函数
不是语言的一部分,也没有任何神奇的特性;它只是一个普通的功能接口,就像
Runnable
谓词
Comparable
。编译器没有理由猜测您的意思是lambda指向
函数
,而不是其他类型


此外,您不需要成为lambda就可以实现
函数
;您可以是命名类或匿名类。Lambdas(和方法refs)是一种语法紧凑的方法,用于指定功能接口的实例

有道理。感谢您的澄清:)
Predicate<String> isEmpty = s -> s.isEmpty();
Function<String, Boolean> isEmpty = s -> s.isEmpty();