JDK1.8及以上的Lambda表示式

belllove_1024發表於2019-04-08

JDK1.8及以上的Lambda表示式(不足之處,還望大佬指正)
這是一個在java jdk1.8及以上出現的一個重量級新特性,這是一個新的程式設計思想(函數語言程式設計思想)的轉變—強調做什麼,而不是以什麼形式做.
這樣官方的解釋,我也很懵啊,舉一個小小的例子吧,在生活中相信大家都感受過春節回家的痛苦吧,往往都是一張回家票難求啊, 這個時候就不管有什麼票了,高鐵票啊,飛機票啊,汽車票啊,只要能回家,什麼票都行(這就是體現了函數語言程式設計思想,只要能達到目的,通過什麼方式不是重要的,方式只是一種手段)

這個時候就出現了帥氣的Lambda表示式.不管是在程式碼的間接度上,還是效率上,都是比之前的匿名內部類要好上不少.

lambda的標準格式:(引數型別 引數名稱) -> {程式碼語句}

格式說明:

  • 小括號內的語法與傳統方法(介面的抽象方法)引數列表一致:無引數則留空;多個引數則用逗號分隔。
  • ->是新引入的語法格式,代表指向動作。
  • 大括號內的語法與傳統方法體(實現抽象方法的方法體)要求基本一致。

使用前提:

  • 使用Lambda必須具有介面,且要求介面中有且僅有一個抽象方法。
  • 使用Lambda必須具有上下文推斷。

舉一個簡單的例子吧:
這是大家所常用的多執行緒程式碼:

  public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println("子執行緒程式碼" + i);
                }
            }
        }).start();
    }

這是Lambda對於多執行緒的寫法:

 public static void main(String[] args) {
 		//Lambda寫法,因為run()方法無參,所以只寫小括號
        new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                System.out.println("子執行緒程式碼" + i);
            }
        }).start();
    }

以上的兩個例子都是一樣的效果.

講講Lambda的省略格式:

  • 小括號內引數的型別可以省略;
  • 如果小括號內有且僅有一個參,則小括號可以省略;
  • 如果大括號內有且僅有一個語句,則無論是否有返回值,都可以省略大括號、return關鍵字及語句分號(要大括號,return,分號要同時省略)。

再來一個省略的Lambda例子:

public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        //給集合新增資料
        Collections.addAll(list, 5, 8, 2, 9, 4);
        //使用Lambda表示式書寫降序規則
        Collections.sort(list, (o1, o2) -> o2 - o1);
        System.out.println(list);//[9, 8, 5, 4, 2]
    }

確實是比匿名內部類好用的多,程式碼簡潔,有逼格!

相關文章