方法引用讓你可以重複使用現有的方法定義,並像 Lambda 一樣進行傳遞。
方法引用可以被看作僅僅呼叫特定方法的 Lambda 的一種快捷寫法。
事實上,方法引用就是讓你根據已有的方法實現來建立 Lambda 表示式。
例:
@Test
public void test1() {
Chat chat = (content) -> System.out.println(content);
chat.say("hello!");
}
@Test
public void test2() {
Chat chat = System.out::println;
chat.say("hello!");
}
interface Chat {
void say(String word);
}
test1是 Lambda 表示式寫法,通過呼叫 println 方法輸出 content。test2 是方法引用,這裡看起來方法引用更加的簡潔明瞭。看完例子,再來看看語法。
語法
這裡把方法引用分為5種
1.靜態方法引用:ClassName::staticMethod
2.特定類的任意物件的方法引用:ClassName::instanceMethod
3.特定物件的方法引用:instance::instanceMethod
4.構造器引用:ClassName::new
5.陣列引用:ClassName[]::new
舉例
語法沒看懂,沒關係,我們舉例來說明-_-
1.靜態方法引用
@Test
public void test3() {
// Function<T,R> 接受一個輸入引數,返回一個結果。(java8定義的函式式介面)
Function<Integer, String> f1 = (s) -> String.valueOf(s); // 將傳入的型別轉換成String
System.out.println(f1.apply(100) + 200); // 輸出100200
Function<Integer, String> f2 = String::valueOf; // 將傳入的型別轉換成String
System.out.println(f2.apply(100) + 200); // 輸出100200
}
2.特定類的任意物件的方法引用
@Test
public void test4() {
// Function<T,R> 接受一個輸入引數,返回一個結果。(java8定義的函式式介面)
Function<String, Integer> f1 = (s) -> s.length(); // 返回字串長度
System.out.println(f1.apply("hello")); // 輸出5
Function<String, Integer> f2 = String::length; // 返回字串長度
System.out.println(f2.apply("hello")); // 輸出5
}
3.特定物件的方法引用
@Test
public void test5() {
String s = "hello";
// IntSupplier 無引數,返回一個int型別結果。(java8定義的函式式介面)
IntSupplier intSupplier1 = () -> s.length(); // 返回字串長度
System.out.println(intSupplier1.getAsInt()); // 輸出5
IntSupplier intSupplier2 = s::length; // 返回字串長度
System.out.println(intSupplier2.getAsInt()); // 輸出5
}
4.構造器引用
@Test
public void test6() {
// Supplier<T> 無引數,返回一個結果。(java8定義的函式式介面)
List list1 = this.getList(() -> new ArrayList());
List list2 = this.getList(ArrayList::new);
}
public static List getList(Supplier<List> s){
return s.get();
}
5.陣列引用
@Test
public void test7() {
// Function<T,R> 接受一個輸入引數,返回一個結果。(java8定義的函式式介面)
Function<Integer, String[]> f1 = length -> new String[length];
String[] strs = f1.apply(10);
System.out.println(strs.length); // 輸出10
Function<Integer,String[]> f2 = String[]::new;
strs = f2.apply(10);
System.out.println(strs.length); // 輸出10
}
參考資料
- http://how2j.cn/p/2807
- 《Java 8函數語言程式設計》
- 《Java 8實戰》