1. 程式人生 > 其它 >【Java教程】(二):Lambda表示式

【Java教程】(二):Lambda表示式

函數語言程式設計思想

函式是有輸入,有輸出的額一個過程,面向物件思想強調的是一切必須通過物件的形式來做事情,

函式式思想則儘量忽略面向物件的複雜語法,強調做什麼,而不是以什麼形式去做,

lambda表示式就是函數語言程式設計思想的體現

在這裡插入圖片描述

Lambda初體驗

需求:啟動一個執行緒,輸出一句話

public class Test {
    public static void main(String[] args) {
        //實現類的方式
        //MyRunnable myRunnable = new MyRunnable();
        //Thread t = new Thread(myRunnable);
//t.start() //匿名內部類的方式 new Thread(new Runnable() { @Override public void run() { System.out.println("多執行緒啟動啦!"); } }).start(); //lambda方式改造 new Thread( ()-> { System.
out.println("多執行緒啟動啦!"); }).start(); } }

lambda方式分析:

  • ()裡面沒內容,可以看作方法形參為空
  • ->用箭頭指向後面要做的事
  • { }包含一段程式碼,稱之為程式碼塊,可以看成方法體中的內容

Lambda表示式標準格式

格式:(形參)->{程式碼塊}

如果有多個形參就用逗號分開,沒有為空即可

Lambda表示式使用前提

  • 有一個介面
  • 介面中有且只有一個抽象方法

Lambda表示式練習

Addable是一個介面,其中有add這個方法,執行完控制檯輸出了30,

執行lambda表示式的時候,系統偷偷的自動建立了一個物件,lambda實現了add方法

lambda表示式的結果其實就是一個實現了介面的物件,這也解釋了傳的引數應該是Addable的實現物件

public class Test {
    public static void main(String[] args) {
        useAddable( (int x,int y)-> {
            return x+y;
        });
    }
    private static void useAddable(Addable a) {//傳的肯定是Addable的實現物件,所以可以呼叫
        int sum = a.add(10,20);
        System.out.println(sum);
    }
}

省略模式

  • 引數型別可以省略,但是不能只省略一個,要省略全省略
  • 如果引數有且僅有一個,小括號可以省略
  • 如果程式碼塊的語句只有一條,可以省略大括號和分號,如果有return也要把return省略

Lambda表示式與匿名內部類的區別

# 所需型別不同
	匿名內部類:可以是介面,也可以是抽象類,還可以是具體類
	Lambda表示式:只能是介面
# 使用限制不同
	如果介面中有且僅有一個抽象方法,可以使用lambda表示式,也可以使用匿名內部類
	如果介面有多個抽象方法,只能使用匿名內部類,不能使用lambda表示式
# 實現原理不同
	匿名內部類:編譯以後產生一個單獨的.class位元組碼檔案
	Lambda表示式:編譯之後沒有一個單獨的.class位元組碼檔案,對應的位元組碼會在執行時動態生成