Java8:從匿名內部類到Lambda表達式&方法引用

匿名內部類、lambda和方法引用其實是相通的,從匿名內部類到lambda到方法引用是一個進化的過程,是一個簡化的過程,更加是一個從抽象的過程。

作用都是實現接口方法,換句話說就是實現接口;只是這個接口只有一個抽象方法。

匿名內部類

省去了實現類,直接new 接口名(){...} 沒有實現類名,實際就是實現且創建了一個接口對象。

  • 匿名內部類也就是沒有名字的內部類
  • 正因爲沒有名字,所以匿名內部類只能使用一次,它通常用來簡化代碼編寫
  • 使用匿名內部類還有個前提條件必須繼承一個父類或實現一個接口

匿名內部類由於沒有名字,所以它的創建方式有點兒奇怪。創建格式如下:

new 父類構造器(參數列表)|實現接口()  
    {  
     //匿名內部類的類體部分  
    }
  • 在這裏我們看到使用匿名內部類我們必須要繼承一個父類或者實現一個接口,當然也僅能只繼承一個父類或者實現一個接口。同時它也是沒有class關鍵字,這是因爲匿名內部類是直接使用new來生成一個對象的引用。當然這個引用是隱式的

Lambda表達式

省去了new 接口名;簡化爲() ->{...} 實際也是實現且創建一個接口對象。

一個方法的參數,括號中是否可以使用Lambda表達式,取決於這個方法的參數類型

----是否是一個函數式接口只有一個抽象方法可以有多個default方法的接口),構造方法也同理。

我們可以將lambda表達式定義爲一種 簡潔、可傳遞的匿名函數

首先我們需要明確lambda表達式本質上是一個函數,雖然它不屬於某個特定的類,但具備參數列表、函數主體、返回類型,以及能夠拋出異常;

其次它是匿名的,lambda表達式沒有具體的函數名稱;lambda表達式可以像參數一樣進行傳遞,從而極大的簡化代碼的編寫。格式定義如下:

格式一: 參數列表 -> 表達式
格式二: 參數列表 -> {表達式集合}

需要注意的是:

  • lambda表達式隱含了return關鍵字,所以在單個的表達式中,我們無需顯式的寫return關鍵字,
  • 但是當表達式是一個語句集合的時候,則需要顯式添加return,並用花括號{ }將多個表達式包圍起來,下面看幾個例子:
//返回給定字符串的長度,隱含return語句
(String s) -> s.length() 

// 始終返回42的無參方法
() -> 42 

// 包含多行表達式,則用花括號括起來
(int x, int y) -> {
    int z = x * y;
    return x + z;
}

 

方法引用

省去了lambda,將接口方法實現的內容封裝到具體方法,將方法作爲接口實現,實際也是實現且創建一個接口對象。

只是更加抽象,只能看到接口方法內部實現(調用的這個方法就是具體實現)。

採用方法引用可以更近一步的簡化代碼,有時候這種簡化讓代碼看上去更加的直觀,先看一個例子:

/* ... 省略apples的初始化操作 */

// 採用lambda表達式
apples.sort((Apple a, Apple b) -> Float.compare(a.getWeight(), b.getWeight()));

// 採用方法引用
apples.sort(Comparator.comparing(Apple::getWeight));

方法引用通過::將方法隸屬和方法自身連接起來,主要分爲三類:

靜態方法

(args) -> ClassName.staticMethod(args)
轉換成
ClassName::staticMethod

參數的實例方法

(args) -> args.instanceMethod()
轉換成
ClassName::instanceMethod  // ClassName是args的類型

外部的實例方法

(args) -> ext.instanceMethod(args)
轉換成
ext::instanceMethod(args)

 

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