Java8的Lambda表達式你瞭解嗎?

五一5天假,說沒就沒,可是學習的腳本不能停下。 express

收假了,咱們仍是要繼續搬磚,學習也不能攜帶。 markdown

給你們帶來一套Java8的祕籍。 ide

Lambda 表達式是什麼

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

Lambda 表達式的語法以下: 學習

(parameters) -> { statements; } spa

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

如何使用 Lambda 表達式

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

// Comparator排序 
List<Integer> list = Arrays.asList(31452);
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);


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