Java8新特性-lambda表示式簡單解釋
阿新 • • 發佈:2019-01-25
lambda表示式格式
- (引數) -> 單行語句; 不需要顯式return, lambda表示式能自行判斷出返回值
- (引數) -> {多行語句}; 如果方法有返回引數的話,需要顯式的使用return
- (引數) -> 表示式;
函式式介面
對於只包含一個抽象方法的介面, 可以通過lambda表示式建立該介面的物件. 這種介面稱為函式式介面
可以使用@FunctionalInterface
例如使用Lambda表示式來實現Runnable介面:
/** * 使用lambda式實現函式式介面時,只能轉換成對應的介面物件, 轉換成object物件都是錯誤的 * 如下面這條語句編譯會報錯 : Object obj = () -> System.out.println("使用lambda表示式來實現Runnable介面") ; * 輸出結果: 使用lambda表示式來實現Runnable介面 */ Runnable r1 = () -> System.out.println("使用lambda表示式來實現Runnable介面") ; new Thread(r1).start();
- 需要注意的時, 如果你的lambda式存在檢查期異常, 那麼該異常需要在目標介面的抽象方法中進行宣告. 如Runnable r2 = () -> Thread.sleep(100);這個lambda表示式無法編譯通過.
方法引用
有時候你想傳遞給其他程式碼的操作已經有實現的方法了. 就可以使用方法引用
方法引用格式
- 引用靜態方法 : 類名稱 :: 靜態方法名稱
- 引用某個物件的方法 : 例項化物件 :: 普通方法
- 引用特定型別的方法 : 特定類 :: 普通方法
- 引用構造方法 : 類名稱 :: new
方法引用使用樣例
引用靜態方法 :
// 宣告為函式式介面 interface IMethodRef{ void print(String s); } public static void main(String [] args) { /** * 將IMethodRef中print方法的實現指向System.out.println方法 * 這裡同樣的,介面只能有一個抽象方法 * 輸出結果 : Hello World */ IMethodRef ref = System.out :: println; ref.print("Hello World"); }
引用某個物件的方法 :
// 宣告為函式式介面 @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 + "]" ;
}
}
// 宣告為函式式介面
@FunctionalInterface
interface IMethodRef<T>{
T create(String name, int age);
}
public class MethodRefTest2 {
public static void main(String [] args) {
// 表示IMethodRef的create引用Person的構造方法來實現
IMethodRef<Person> ref = Person :: new;
Person p = ref.create("七夜雪", 18);
// 輸出結果, Person [name=七夜雪, age=18]
System.out.println(p) ;
}
}