一、什麼是方法引用
在Lambda表達式中,將其劃分了幾塊。這一行就是lambda表達式。() -> System.out.println(“使用Lambda表達式”);下面我們對lambda的格式進行一個介紹:
(1)左邊括號:lambda的形參列表,就好比是我們定義一個接口,裏面有一個抽象方法,這個抽象方法的形參列表。
(2)箭頭:lambda的操作符,所以你看見這個箭頭心中知道這是一個lambda表達式就可以了。
(3)右邊lambda體:就好比是我們實現了接口中的抽象方法。
在最後一塊中,有時候,lambda體可能僅僅調用一個已存在的方法,而不做任何其它事,對於這種情況,通過一個方法名字來引用這個已存在的方法會更加清晰。
所以我們來總結:
方法引用是一個更加緊湊,易讀的 Lambda 表達式,注意方法引用是一個 Lambda 表達式,其中方法引用的操作符是雙冒號 "::"。
二、舉例演示
1、我們首先定義一個User類
現在有一個功能,那就是需要按照年齡,對Person進行排序。
2、Lambda表達式寫法
我們使用lambda表達式可以直接進行比較。現在我們使用方法引用。
這下子代碼是不是更加的簡潔了。我們相當於把lambda表達式進行了改變。下面我們就來好好地講解一下方法引用是如何使用的。
三、方法引用分類
先來說一下方法引用使用到的操作符“::”,這個操作符把方法引用分成兩邊,左邊是類名或者某個對象的引用,右邊是方法名。引用方法有下面幾種方式:
(1)對象引用::實例方法名
(2)類名::靜態方法名
(3)類名::實例方法名
(4)類名::new
(5)類型[]::new
我們對這5種方式分別來敘述。
1、對象引用::實例方法名
我們創建了一個PersonCompare對象,調用了其內部的compareByName實例方法。
2、類名::靜態方法名
舉幾個例子:
String::valueOf,等價於 Lambda:s -> String.valueOf(s)
Math::pow 等價於lambda表達式 (x, y) -> Math.pow(x, y);
Person::compareByAge 就是一個靜態方法引用,也是前面我們舉得例子。
Function<Long, Long> f = Math::abs;
Long result = f.apply(-3L);123
Math是一個類而abs爲該類的靜態方法。Function中的唯一抽象方法apply方法參數列表與abs方法的參數列表相同,都是接收一個Long類型參數。
3、類名::實例方法名
若Lambda表達式的參數列表的第一個參數,是實例方法的調用者,第二個參數(或無參)是實例方法的參數時,就可以使用這種方法:
BiPredicate<String, String> b = String::equals;
b.test("abc", "abcd");
String是一個類而equals爲該類的定義的實例方法。BiPredicate中的唯一抽象方法test方法參數列表與equals方法的參數列表相同,都是接收兩個String類型參數。
4、類名::new
在引用構造器的時候,構造器參數列表要與接口中抽象方法的參數列表一致。對應的 Lambda:
上面這段代碼的功能就是使用PersonFactory工廠,然後使用Person::new創建一個Person實例。
5、類型[]::new
引用數組和引用構造器很像,格式爲 類型[]::new,等價於 lambda 表達式 x -> new int[x]。其中類型可以爲基本類型也可以是類。
原文:https://baijiahao.baidu.com/s?id=1652786021461159890&wfr=spider&for=pc