(參數(shù)) -> 單行語句; 不需要顯式return, lambda表達式能自行判斷出返回值
(參數(shù)) -> {多行語句}; 如果方法有返回參數(shù)的話,需要顯式的使用return
(參數(shù)) -> 表達式;
函數(shù)式接口
對于只包含一個抽象方法的接口, 可以通過lambda表達式創(chuàng)建該接口的對象. 這種接口稱為函數(shù)式接口
可以使用@FunctionalInterface
例如使用Lambda表達式來實現(xiàn)Runnable接口:
/** * 使用lambda式實現(xiàn)函數(shù)式接口時,只能轉換成對應的接口對象, 轉換成object對象都是錯誤的 * 如下面這條語句編譯會報錯 : Object obj = () -> System.out.println("使用lambda表達式來實現(xiàn)Runnable接口") ; * 輸出結果: 使用lambda表達式來實現(xiàn)Runnable接口 */ Runnable r1 = () -> System.out.println("使用lambda表達式來實現(xiàn)Runnable接口") ; new Thread(r1).start();
需要注意的時, 如果你的lambda式存在檢查期異常, 那么該異常需要在目標接口的抽象方法中進行聲明. 如Runnable r2 = () -> Thread.sleep(100);這個lambda表達式無法編譯通過.
方法引用
有時候你想傳遞給其他代碼的操作已經有實現(xiàn)的方法了. 就可以使用方法引用
方法引用格式
引用靜態(tài)方法 : 類名稱 :: 靜態(tài)方法名稱
引用某個對象的方法 : 實例化對象 :: 普通方法
引用特定類型的方法 : 特定類 :: 普通方法
引用構造方法 : 類名稱 :: new
方法引用使用樣例
引用靜態(tài)方法 :
// 聲明為函數(shù)式接口 interface IMethodRef{ void print(String s); } public static void main(String [] args) { /** * 將IMethodRef中print方法的實現(xiàn)指向System.out.println方法 * 這里同樣的,接口只能有一個抽象方法 * 輸出結果 : Hello World */ IMethodRef ref = System.out :: println; ref.print("Hello World"); }
引用某個對象的方法 :
// 聲明為函數(shù)式接口 @FunctionalInterface interface IMethodRef{ String upper(); } public static void main(String [] args) { /** * "Hello World" : 表示一個String實例 * IMethodRef的upper方法,引用String實例的toUpperCase()方法,等同于"Hello World".toUpperCase() * 輸出結果 : HELLO WORLD */ IMethodRef ref = "Hello World" :: toUpperCase; System.out.println(ref.upper()) ; }
引用特定類型的方法 :
@FunctionalInterface interface IMethodRef{ int compareTo(BigDecimal big1, BigDecimal big2); } public static void main(String [] args) { IMethodRef ref = BigDecimal :: compareTo; // 等同于調用BigDecimal.ONE.compareTo(BigDecimal.ZERO), 輸出結果是1 System.out.println(ref.compareTo(BigDecimal.ONE, BigDecimal.ZERO)) ; // 等同于調用BigDecimal.ZERO.compareTo(BigDecimal.ONE) , 輸出結果是-1 System.out.println(ref.compareTo(BigDecimal.ZERO, BigDecimal.ONE)) ; }
引用構造方法 :
package lambda; class Person{ private String name; private int age; public Person(String name, int age) { this.name = name ; this.age = age ; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]" ; } } // 聲明為函數(shù)式接口 @FunctionalInterface interface IMethodRef<T>{ T create(String name, int age); } public class MethodRefTest2 { public static void main(String [] args) { // 表示IMethodRef的create引用Person的構造方法來實現(xiàn) IMethodRef<Person> ref = Person :: new; Person p = ref.create("七夜雪", 18); // 輸出結果, Person [name=七夜雪, age=18] System.out.println(p) ; } }想要了解更多的java應用技術那就加入我們吧!