Java 8的方法引用詳解(讓你的代碼看起來高大上)
在上一篇文章中曾經(jīng)介紹到了java8中的Lambda表達(dá)式,這篇文章是基于Lambda表達(dá)式來敘述的。主要講解方法引用。在此之前還希望你能夠了解一下函數(shù)式接口的使用。
一、什么是方法引用
在Lambda表達(dá)式中,將其劃分了幾塊。這一行就是lambda表達(dá)式。() -> System.out.println("使用Lambda表達(dá)式");下面我們對(duì)lambda的格式進(jìn)行一個(gè)介紹:
(1)左邊括號(hào):lambda的形參列表,就好比是我們定義一個(gè)接口,里面有一個(gè)抽象方法,這個(gè)抽象方法的形參列表。
(2)箭頭:lambda的操作符,所以你看見這個(gè)箭頭心中知道這是一個(gè)lambda表達(dá)式就可以了。
(3)右邊lambda體:就好比是我們實(shí)現(xiàn)了接口中的抽象方法。
在最后一塊中,有時(shí)候,lambda體可能僅僅調(diào)用一個(gè)已存在的方法,而不做任何其它事,對(duì)于這種情況,通過一個(gè)方法名字來引用這個(gè)已存在的方法會(huì)更加清晰。
所以我們來總結(jié):方法引用是一個(gè)更加緊湊,易讀的 Lambda 表達(dá)式,注意方法引用是一個(gè) Lambda 表達(dá)式,其中方法引用的操作符是雙冒號(hào) "::"。
二、舉例演示
1、我們首先定義一個(gè)User類

現(xiàn)在有一個(gè)功能,那就是需要按照年齡,對(duì)Person進(jìn)行排序。
2、Lambda表達(dá)式寫法

我們使用lambda表達(dá)式可以直接進(jìn)行比較。現(xiàn)在我們使用方法引用。

這下子代碼是不是更加的簡(jiǎn)潔了。我們相當(dāng)于把lambda表達(dá)式進(jìn)行了改變。下面我們就來好好地講解一下方法引用是如何使用的。
三、方法引用分類
先來說一下方法引用使用到的操作符“::”,這個(gè)操作符把方法引用分成兩邊,左邊是類名或者某個(gè)對(duì)象的引用,右邊是方法名。引用方法有下面幾種方式:
(1)對(duì)象引用::實(shí)例方法名
(2)類名::靜態(tài)方法名
(3)類名::實(shí)例方法名
(4)類名::new
(5)類型[]::new
我們對(duì)這5種方式分別來敘述。
1、對(duì)象引用::實(shí)例方法名

我們創(chuàng)建了一個(gè)PersonCompare對(duì)象,調(diào)用了其內(nèi)部的compareByName實(shí)例方法。
2、類名::靜態(tài)方法名
舉幾個(gè)例子:
String::valueOf,等價(jià)于 Lambda:s -> String.valueOf(s)
Math::pow 等價(jià)于lambda表達(dá)式 (x, y) -> Math.pow(x, y);
Person::compareByAge 就是一個(gè)靜態(tài)方法引用,也是前面我們舉得例子。
Function<Long, Long> f = Math::abs; Long result = f.apply(-3L);123
Math是一個(gè)類而abs為該類的靜態(tài)方法。Function中的唯一抽象方法apply方法參數(shù)列表與abs方法的參數(shù)列表相同,都是接收一個(gè)Long類型參數(shù)。
3、類名::實(shí)例方法名
若Lambda表達(dá)式的參數(shù)列表的第一個(gè)參數(shù),是實(shí)例方法的調(diào)用者,第二個(gè)參數(shù)(或無參)是實(shí)例方法的參數(shù)時(shí),就可以使用這種方法:
BiPredicate<String, String> b = String::equals; b.test("abc", "abcd");
String是一個(gè)類而equals為該類的定義的實(shí)例方法。BiPredicate中的唯一抽象方法test方法參數(shù)列表與equals方法的參數(shù)列表相同,都是接收兩個(gè)String類型參數(shù)。
4、類名::new
在引用構(gòu)造器的時(shí)候,構(gòu)造器參數(shù)列表要與接口中抽象方法的參數(shù)列表一致。對(duì)應(yīng)的 Lambda:() -> new String()。

上面這段代碼的功能就是使用PersonFactory工廠,然后使用Person::new創(chuàng)建一個(gè)Person實(shí)例。
5、類型[]::new
引用數(shù)組和引用構(gòu)造器很像,格式為 類型[]::new,等價(jià)于 lambda 表達(dá)式 x -> new int[x]。其中類型可以為基本類型也可以是類。

OK。方法引用就是這么簡(jiǎn)單。