天天看點

【Java筆記】(二):Lambda表達式函數式程式設計思想Lambda初體驗Lambda表達式标準格式Lambda表達式使用前提Lambda表達式練習省略模式Lambda表達式與匿名内部類的差別

函數式程式設計思想

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

函數式思想則盡量忽略面向對象的複雜文法,強調做什麼,而不是以什麼形式去做,

lambda表達式就是函數式程式設計思想的展現

【Java筆記】(二):Lambda表達式函數式程式設計思想Lambda初體驗Lambda表達式标準格式Lambda表達式使用前提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位元組碼檔案,對應的位元組碼會在運作時動态生成