Lambda表達式之方法引用

方法引用

方法引用可以被看做僅僅調用特定方法的Lambda的一種快捷寫法。它的基本思想是,如果一個Lambda代表的只是”直接調用這個方法“,那最好還是用名稱來調用它,而不是去描述如何調用它。
  事實上,方法引用就是讓你根據已有的方法實現來創建Lambda表達式。但是,顯式地指明方法的名稱,你的代碼可讀性會更好。

如何構建方法引用

方法引用主要有三類:
(1)指向靜態方法的方法引用(例如Integer的parseInt方法,寫作Integer::parseInt)
(2)指向任意類型實例方法的方法引用(例如String的length方法,寫作String::length)
(3)指向現有對象的實例方法的方法引用(假設你有一個局部變量expensiveTransaction用於存放Transaction
第一種很好理解,就是靜態方法
第二種就是你在引用一個對象的方法,而這個對象本身是Lambda的一個參數。
例如:Lambda表達式(String s) - > s.toUpperCase()可以寫作String::toUpperCase。
第三種就是你在Lambda中調用一個已經存在的外部對象中的方法。
例如:Lambda表達式()-> expensiveTransaction.getValue()可以寫作expensiveTransaction::getValue。

構造函數引用

  對於一個現有構造函數,可以利用它的名稱和關鍵字new,來創建一個它的一個引用:ClassName::new。它的功能與指向靜態方法的引用類似。

Supplier<Apple> c1 = Apple::new;
Apple a1 = c1.get();

等價於:

Supplier<Apple> c1 = () -> new Apple();
Apple a1 = c1.get();

如果你的構造函數的簽名是Apple(Integer weight),那麼它就適合Function接口的簽名,於是你可以這樣寫:

Function<Integer,Apple> c2 = Apple::new;
Apple a2 = c2.apple(110);

這等價於:

Function<Integer,Apple> c2 = (weight) -> new Apple(weight);
Apple a2 = c2.apple(110);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章