Java8新特性(一) 之 Lambda表達式

Lambda表達式是什麼

Lambda表達式(lambda expression)是一個匿名函數,由數學中的λ演算而得名。在Java 8中可以把Lambda表達式理解爲匿名函數,它沒有名稱,但是有參數列表、函數主體、返回類型等。

Lambda表達式的語法如下:

(parameters) -> { statements; }

爲什麼要使用Lambda表達式?前面你也看到了,在Java中使用內部類顯得十分冗長,要編寫很多樣板代碼,Lambda表達式正是爲了簡化這些步驟出現的,它使代碼變得清晰易懂。

如何使用Lambda表達式

Lambda表達式是爲了簡化內部類的,你可以把它當成是內部類的一種簡寫方式,只要是有內部類的代碼塊,都可以轉化成Lambda表達式:

// Comparator排序
List<Integer> list = Arrays.asList(3, 1, 4, 5, 2);
list.sort(new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1.compareTo(o2);
    }
});

// 使用Lambda表達式簡化
list.sort((o1, o2) -> o1.compareTo(o2));
// Runnable代碼塊
Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello Man!");
    }
});

// 使用Lambda表達式簡化
Thread thread = new Thread(() -> System.out.println("Hello Man!"));

可以看出,只要是內部類的代碼塊,就可以使用Lambda表達式簡化,並且簡化後的代碼清晰易懂。

方法引用

甚至,Comparator排序的Lambda表達式還可以進一步簡化:

list.sort(Integer::compareTo);

這種寫法被稱爲 方法引用,方法引用是Lambda表達式的簡便寫法。如果你的Lambda表達式只是調用這個方法,最好使用名稱調用,而不是描述如何調用,這樣可以提高代碼的可讀性。

方法引用使用::分隔符,分隔符的前半部分表示引用類型,後面半部分表示引用的方法名稱。例如:Integer::compareTo表示引用類型爲Integer,引用名稱爲compareTo的方法。

對於 Lambda 表達式到方法引用的簡化,我們提供以下規則:

Lambda 表達式 方法引用
(args) -> ClassName.staticMethod(args) ClassName::staticMethod
(arg0, …) -> arg0.instanceMethod(…) ClassName::instanceMethod
(args) -> expression.instanceMethod(args) expression::instanceMethod

特別的,對於構造函數的方法引用: ClassName::new
類似使用方法引用的例子還有打印集合中的元素到控制檯中:
list.forEach(System.out::println);


求關注、分享、在看!!! 你的支持是我創作最大的動力。

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