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

Jul*_*bin 4 methods lambda types java-8

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

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

代替

((Integer i) -> i*2).compose((Integer i) -> i+2).apply(4)
Run Code Online (Sandbox Code Playgroud)

Bri*_*etz 12

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

Object lambda = x -> x;
Run Code Online (Sandbox Code Playgroud)

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

Predicate<String> isEmpty = s -> s.isEmpty();
Function<String, Boolean> isEmpty = s -> s.isEmpty();
Run Code Online (Sandbox Code Playgroud)

界面Function不是语言的一部分,也没有任何魔法属性; 它只是一个普通的功能界面,就像RunnablePredicateComparable.编译器没有理由猜测你的意思是lambda Function而不是其他类型.

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