天天看點

JDK1.8及以上的Lambda表達式

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]
    }
           

确實是比匿名内部類好用的多,代碼簡潔,有逼格!