Java8之Lambda 原

1、前提知識儲備

1)利用匿名內部類實現Java接口方法

平常最常用的可能是定義Runnable的匿名類

new Thread(new Runnable() {		
	@Override
	public void run() {
	}
}).start();

2)函數式接口 functional interface

函數式接口(Functional Interface)是Java 8對一類特殊類型的接口的稱呼。 這類接口只定義了唯一的抽象方法的接口(除了隱含的Object對象的公共方法), 因此最開始也就做SAM類型的接口(Single Abstract Method)。

爲什麼會單單從接口中定義出此類接口呢? 原因是在Java Lambda的實現中, 開發組不想再爲Lambda表達式單獨定義一種特殊的Structural函數類型,稱之爲箭頭類型(arrow type), 依然想採用Java既有的類型系統(class, interface, method等), 原因是增加一個結構化的函數類型會增加函數類型的複雜性,破壞既有的Java類型,並對成千上萬的Java類庫造成嚴重的影響。 權衡利弊, 因此最終還是利用SAM 接口作爲 Lambda表達式的目標類型。

JDK中已有的一些接口本身就是函數式接口,如Runnable。 JDK 8中又增加了java.util.function包, 提供了常用的函數式接口。

函數式接口代表的一種契約, 一種對某個特定函數類型的契約。 在它出現的地方,實際期望一個符合契約要求的函數。 Lambda表達式不能脫離上下文而存在,它必須要有一個明確的目標類型,而這個目標類型就是某個函數式接口。

函數式接口中可以額外定義多個抽象方法,但這些抽象方法簽名必須和Object的public方法一樣

接口最終有確定的類實現, 而類的最終父類是Object。 因此函數式接口可以定義Object的public方法。
如以下的接口依然是函數式接口:

@FunctionalInterface
public interface ObjectMethodFunctionalInterface {
	void count(int i);
	
	String toString(); //same to Object.toString
	int hashCode(); //same to Object.hashCode
	boolean equals(Object obj); //same to Object.equals
}

爲什麼限定public類型的方法呢?因爲接口中定義的方法都是public類型的。 舉個例子,下面的接口就不是函數式接口:

interface WrongObjectMethodFunctionalInterface {
	void count(int i);
	
	Object clone(); //Object.clone is protected
}

因爲Object.clone方法是protected類型。

以上內容出自:http://colobu.com/2014/10/28/secrets-of-java-8-functional-interface/

2、lambda

java中lambda表達式的格式:參數、箭頭->、一個表達式。
image

具體細節可參考:http://blog.720ui.com/2016/java_se8_01_lambda/

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章