java8新特性之lambda表達式!

Lambda 表達式,也可稱爲閉包,它是推動 Java 8 發佈的最重要新特性。

Lambda 允許把函數作爲一個方法的參數(函數作爲參數傳遞進方法中)。

使用 Lambda 表達式可以使代碼變的更加簡潔緊湊。

(parameters) -> expression
或
(parameters) ->{ statements; }

lambda表達式主要有以下特徵:

  • 可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。
  • 可選的參數圓括號:一個參數無需定義圓括號,但多個參數需要定義圓括號。
  • 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
  • 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值。

代碼的形式就是:

// 1. 不需要參數,返回值爲 5  
() -> 5  
  
// 2. 接收一個參數(數字類型),返回其2倍的值  
x -> 2 * x  
  
// 3. 接受2個參數(數字),並返回他們的差值  
(x, y) -> x – y  
  
// 4. 接收2個int型整數,返回他們的和  
(int x, int y) -> x + y  
  
// 5. 接受一個 string 對象,並在控制檯打印,不返回任何值(看起來像是返回void)  
(String s) -> System.out.print(s)

具體實例:

public class Java8Tester {
    public static void main(String args[]){
        Java8Tester tester = new Java8Tester();

        // 類型聲明
        MathOperation addition = (int a, int b) -> a + b;

        // 不用類型聲明
        MathOperation subtraction = (a, b) -> a - b;

        // 大括號中的返回語句
        MathOperation multiplication = (int a, int b) -> { return a * b; };

        // 沒有大括號及返回語句
        MathOperation division = (int a, int b) -> a / b;

        System.out.println("10 + 5 = " + tester.operate(10, 5, addition));
        System.out.println("10 - 5 = " + tester.operate(10, 5, subtraction));
        System.out.println("10 x 5 = " + tester.operate(10, 5, multiplication));
        System.out.println("10 / 5 = " + tester.operate(10, 5, division));

        // 不用括號
        GreetingService greetService1 = message ->
                System.out.println("Hello " + message);

        // 用括號
        GreetingService greetService2 = (message) ->
                System.out.println("Hello " + message);

        greetService1.sayMessage("Runoob");
        greetService2.sayMessage("Google");
    }

    interface MathOperation {
        int operation(int a, int b);
    }

    interface GreetingService {
        void sayMessage(String message);
    }

    private int operate(int a, int b, MathOperation mathOperation){
        return mathOperation.operation(a, b);
    }
}

輸出結果爲:

10 + 5 = 15
10 - 5 = 5
10 x 5 = 50
10 / 5 = 2
Hello Baidu
Hello Google

再來個比較實際的例子,我們對一個List中的各項排序,我們來對比一下Java7和java8的區別:

使用Java8中的lambda表達式:

public class lambda {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("taobao");
        names.add("jingdong");
        names.add("yamaxun");
        names.add("tianmao");
        Collections.sort(names, (s1, s2) -> s1.compareTo(s2));
        System.out.println(names);
    }
}

java7沒有lambda表達式的情況:

public class nolambda {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("taobao");
        names.add("jingdong");
        names.add("yamaxun");
        names.add("tianmao");
        Collections.sort(names, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        System.out.println(names);
    }
}

可以很明顯的對比出來,在不適用lambda表達式的情況下我們需要New一個comparator出來,還要重寫一個compare方法,使用lambda表達式直接使用(s1, s2) -> s1.compareTo(s2)這種形式替換compare方法,只需要一行代碼即可替換這六行代碼,代碼的簡介程度得到了很大的提升!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章