2016-10-04 47 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

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