1. 程式人生 > >Java8新特性-lambda表示式簡單解釋

Java8新特性-lambda表示式簡單解釋

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) ;
	}
	
}