五一5天假,說沒就沒,可是學習的腳本不能停下。 express
收假了,咱們仍是要繼續搬磚,學習也不能攜帶。 markdown
給你們帶來一套Java8的祕籍。 ide
Lambda 表達式(lambda expression)是一個匿名函數,由數學中的 λ 演算而得名。 在 Java 8 中能夠把 Lambda 表達式理解爲匿名函數,它沒有名稱,可是有參數列表、函數主體、返回類型等。 函數
Lambda 表達式的語法以下: 學習
(parameters) -> { statements; } spa
爲何要使用 Lambda 表達式? 前面你也看到了,在 Java 中使用內部類顯得十分冗長,要編寫不少樣板代碼,Lambda 表達式正是爲了簡化這些步驟出現的,它使代碼變得清晰易懂。 code
Lambda 表達式是爲了簡化內部類的,你能夠把它當成是內部類的一種簡寫方式,只要是有內部類的代碼塊,均可以轉化成 Lambda 表達式: orm
// 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);
求關注、分享、在看! ! ! 你的支持是我創做最大的動力。