Lambda表達式的使用
Lambda 表達式是 JDK8 的一個新特性,可以取代大部分的匿名內部類,寫出更優雅的 Java 代碼,尤其在集合的遍歷和其他集合操作中,可以極大地優化代碼結構。
Lambda的新特性:
Lambda 表達式,也可稱爲閉包,它是推動 Java 8 發佈的最重要新特性。
Lambda 允許把函數作爲一個方法的參數(函數作爲參數傳遞進方法中)。
使用 Lambda 表達式可以使代碼變的更加簡潔緊湊。
Lambda的重要特徵:
- 可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。
- 可選的參數圓括號:一個參數無需定義圓括號,但多個參數需要定義圓括號。
- 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
- 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值。
Lambda 基礎語法
/**多個參數有返回值*/
@FunctionalInterface
public interface ReturnMultiParam {
int method(int a, int b);
}
@FunctionalInterface
修飾函數式接口的,要求接口中的抽象方法只有一個。 這個註解往往會和 lambda 表達式一起出現。
語法形式爲 () -> {}
,其中 () 用來描述參數列表,{} 用來描述方法體,-> 爲 lambda運算符 ,讀作(goes to)。
Lambda 語法簡化
對應的方法調用爲:
//多個參數有返回值
ReturnMultiParam returnMultiParam = (int a, int b) -> {
System.out.println("ReturnMultiParam param:" + "{" + a + "," + b +"}");
return 1;
};
int res3 = returnMultiParam.method(6, 8);
方法還可以進步簡潔:
1. 只有一個參數可以省略括號 (int a) >> a ,且省略參數類型
2. 如果方法體中只有一個語句,則可以省略括號
ReturnMultiParam returnMultiParam = a ->System.out.println("ReturnMultiParam param:" + a);
3. 如上是省略大括號的 有return值的 表達式
ReturnMultiParam returnMultiParam = a -> 1 + a;
4. //lambda4 引用了已經實現的 addTwo 方法
Exe1 exe = new Exe1();
ReturnOneParam lambda4 = exe::addTwo; // 調用非靜態方法
ReturnOneParam lambda5 = Exe1 ::addTwo2; // 調用靜態方法
構造方法的引用
interface ItemCreatorParamContruct {
Item getItem(int id, String name, double price);
}
構造方法的Lambda使用:
ItemCreatorParamContruct creator3 = Item::new;
Item item3 = creator3.getItem(112, "鼠標", 135.99);
等價於常規的表達式
ItemCreatorParamContruct creator4 = new ItemCreatorParamContruct() {
@Override
public Item getItem(int id, String name, double price) {
return new Item(id, name, price);
}
};
creator4.getItem(112, "鼠標", 135.99);
集合的使用
- 集合的遍歷
@RequiresApi(api = Build.VERSION_CODES.N)
ArrayList<Integer> list = new ArrayList<>();
//lambda表達式 方法引用
list.forEach(System.out::println);
list.forEach(element -> {
if (element % 2 == 0) {
System.out.println(element);
}
});
- 刪除集合中元素
ArrayList<Item> items = new ArrayList<>();
items.removeIf(ele -> ele.getId() == 7);
- 集合內元素的排序
ArrayList<Item> list = new ArrayList<>();
list.sort((o1, o2) -> o1.getId() - o2.getId());
推薦鏈接: