Java 8 中的方法引用,輕鬆減少程式碼量,提升可讀性!
- 引用特定物件的例項方法
為了演示這種型別的方法引用,我們新建以下這兩個類:
public class Bicycle {
private String brand;
private Integer frameSize;
// standard constructor, getters and setters
}
public class BicycleComparator implements Comparator {
@Override
public int compare(Bicycle a, Bicycle b) {
return a.getFrameSize().compareTo(b.getFrameSize());
}
}
建立一個 BicycleComparator 物件來比較自行車尺寸:
BicycleComparator bikeFrameSizeComparator = new BicycleComparator();
我們可以使用lambda表示式按尺寸大小對自行車進行排序,但需要指定兩個自行車例項進行比較:
createBicyclesList().stream()
.sorted((a, b) -> bikeFrameSizeComparator.compare(a, b));
我們可以使用方法引用讓編譯器把控制程式碼引數傳遞給我們:
createBicyclesList().stream()
.sorted(bikeFrameSizeComparator::compare);
4. 引用特定型別任意物件的例項方法
這種型別的方法引用與前面的示例類似,但不必建立自定義物件來執行比較。
讓我們建立一個要排序的Integer 整數列表:
List numbers = Arrays.asList(5, 3, 50, 24, 40, 2, 9, 18);
如果我們使用經典的 lambda 表示式,這兩個引數都需要顯式傳遞,而使用方法引用則要簡單得多:
numbers.stream()
.sorted((a, b) -> a.compareTo(b));
numbers.stream()
.sorted(Integer::compareTo);
儘管它仍然是一行程式碼,但是方法引用更容易閱讀和理解。
- 引用建構函式
我們可以像在第一個例子中引用靜態方法一樣引用建構函式。唯一區別是需要使用new關鍵字。
現在我們用不同品牌的String列表建立一個Bicycle陣列:
List bikeBrands = Arrays.asList(“Giant”, “Scott”, “Trek”, “GT”);
首先,我們將向Bicycle類新增一個新的建構函式:
public Bicycle(String brand) {
this.brand = brand;
this.frameSize = 0;
}
接下來,我們將使用方法引用中的新建構函式,並從原始的String列表中生成一個Bicycle陣列:
bikeBrands.stream()
.map(Bicycle::new)
.toArray(Bicycle[]::new);
注意如何使用方法引用呼叫Bicycle和Array建構函式,從而使程式碼看起來更加簡潔明瞭。
- 其他示例和限制
目前為止,方法引用是一個使程式碼非常清晰和易讀的好方法。但是,我們不能用它們來代替各種lambda表示式,因為它們有一些侷限性。
它們的主要侷限性是由於它們最大的優點:前一個表示式的輸出需要與引用的方法宣告的輸入引數匹配。
看看這個限制的例子:
createBicyclesList().forEach(b -> System.out.printf(
“Bike brand is ‘%s’ and frame size is ‘%d’%n”,
b.getBrand(),
b.getFrameSize()));
這個簡單的例子不能用方法引用來表示,因為在我們的例子中,printf 方法需要3個引數,而使用createBicyclesList().forEach()只允許方法引用一個引數(Bicycle物件)。
最後,我們研究下,如何建立一個可以從lambda表示式引用的no-operation函式。
在本例中,我們希望使用lambda表示式而不使用其引數。
首先,建立 doNothingAtAll 方法:
private static void doNothingAtAll(Object… o) {
}
因為這是一個varargs方法,它可執行在任意 lambda 表示式中,而不管引用的物件或引數的數量。我們看看它的作用:
createBicyclesList()
.forEach((o) -> MethodReferenceExamples.doNothingAtAll(o));
亞馬遜測評 www.yisuping.com
相關文章
- SOFAStack推出雲原生產品BizStack 可減少30%程式碼量AST
- 提升程式碼的可讀性系列(一)–基礎篇
- 在pandas中使用pipe()提升程式碼可讀性
- 前端開發中減少重複勞動,提升效率的方法前端
- J2EE開發中減少編寫程式碼工作量的幾種方法
- 程式中減少使用 if 語句的方法集錦
- 程式中減少使用if語句的方法集錦
- 減少程式碼中該死的 if else 巢狀巢狀
- 減少C++程式碼編譯時間的方法C++編譯
- javascript 程式碼可讀性JavaScript
- 一對一影片直播原始碼,利用列舉提升程式碼的可讀性原始碼
- js儘量減少程式碼重複執行的次數JS
- 6 個重構方法可幫你提升 80% 的程式碼質量
- 論減少程式碼中return語句的騷操作
- 如何提高程式碼的可讀性? - 讀《編寫可讀程式碼的藝術》
- Java8——方法引用Java
- 減少運維工作量,如何透過 ROS 輕鬆實現資源編排新方式運維ROS
- 看我用AspectJ切切切程式碼來減少工作量
- Java 中的方法引用Java
- 設計模式——使用模板方法模式儘量減少重複相似的程式碼段設計模式
- 使用MVVM減少控制器程式碼實戰(減少56%)MVVM
- 6 個重構方法可幫你提升 80% 的程式碼質量(轉)
- 程式碼可讀性隨想
- 程式碼質量第 3 層 - 可讀的程式碼
- 『 效率工具 』Spring Boot版的輕量級程式碼生成器,減少70%以上的開發任務Spring Boot
- java8(二)方法引用Java
- 輕鬆搞懂Java中的自旋鎖Java
- 使用java8的方法引用替換硬編碼Java
- [譯] 使用多重賦值與元組解包提升 Python 程式碼的可讀性賦值Python
- 輕鬆學習 JavaScript(8):JavaScript 中的類JavaScript
- 怎麼減少程式設計中的 bug?程式設計
- 字元編碼方式輕鬆解讀字元
- 編寫可讀性程式碼的藝術
- Optional簡化空值判斷,減少程式碼中的if-else程式碼塊
- 輕鬆看懂Java位元組碼Java
- Java 8 新特性之方法引用Java
- 想要在 PDF 中插入或者減少幾頁?這兩個功能配合使用,輕鬆完成繁瑣操作
- 提升程式碼管理效率,Cornerstone 4 for Mac助您輕鬆駕馭版本控制Mac