2016-10-04 53 views
4

方法参考和lambda我不知道为什么方法的引用和lambda表达式不会被识别为一个功能。为什么我需要写类型的Java中8

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) 

回答

12

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

Object lambda = x -> x; 

Lambda表达式是聚表达式,其表达式,其类型取决于它们的上下文。与单个(非Object)抽象方法的接口 - 特别是λ表达式从其目标类型,它必须是一个功能接口导出其类型。相同lambda表达式可以具有多种类型,根据其目标类型:

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

接口Function不是语言的一部分,也不具有任何魔法属性;它仅仅是一个普通的功能界面,就像RunnablePredicateComparable。没有理由的编译器可以猜测你的意思是拉姆达目标Function,而不是其他类型。

而且,你不必是实施Function一个lambda;你可能是一个命名类或匿名类。 Lambdas(和方法参考)是一种用于指定功能接口实例的语法紧凑方法。

+0

有道理。感谢您的澄清:) –