Java是物件導向的程式語言,而物件導向的實踐,成功地拉近人類大腦的思維邏輯與程式開發的邏輯,使得程式開發專案從需求、分析、架構、設計到製作,各階段的鴻溝得以縮到最小,進而降低專案失敗的可能性。
物件導向模擬真實世界的情境,藉由不同功能物件的協同作業,來達成系統特定的功能。然而在某些情況下,物件的思維反而會使得程式開發變得有點煩瑣和累贅,例如提供給視窗程式用的事件處理器(Event Handler)、提供給排序邏輯用的比較子(Comparator)、建構執行緒用的Runnable物件等,如果都按照正統的作法來開發,最精簡的方式大概就只有透過巢狀類別(Nested Class)的寫法了。
舉例來說,假設有一個Product類別,其成員包括id(int)、name(String)、stock(int)、unitPrice(double),Product本身並沒有實作Comparable,現在有一群存放在ArrayList裡的Product物件,我們想利用Product的name欄位來排序,但又不想額外撰寫比較子(Compatator)類別,其做法可能如下:
ArrayList <Product> products = new ArrayList< >();
products.add (new Product(5, "Tiger", 500, 380000.6));
products.add (new Product(1, "Elephant", 200, 290000.5));
products.add (new Product(6, "Cat", 700, 80000.2));
products.add (new Product(4, "Impala", 600, 120000.3));
products.add (new Product(2, "Lion", 100, 450000.9));
products.add (new Product(3, "Dog", 300, 90000.7));
Collections.sort (products,
new Comparator <Product> () {
@Override
public int compare(Product o1, Product o2) {
return o1.getName().compareTo(o2.getName());
}
}
);
for (Product p:products){
System.out.println(p);
}
巢狀類別的寫法,的確讓程式碼變得稍微複雜,可讀性也降低了不少。Java SE 8引進了Lambda Expression的語法,可讓程式碼進一步簡化如下:
ArrayList <Product> products = new ArrayList< > ( );
products.add (new Product( 5, "Tiger", 500, 380000.6));
products.add (new Product( 1, "Elephant", 200, 290000.5));
products.add (new Product( 6, "Cat", 700, 80000.2));
products.add (new Product( 4, "Impala", 600, 120000.3));
products.add (new Product( 2, "Lion", 100, 450000.9));
products.add (new Product( 3, "Dog", 300, 90000.7));
Collections.sort(products, (Product o1, Product o2) - > o1.getName( ).compareTo(o2.getName( )));
products.stream( ).forEach((p) - > {System.out.println(p);});
是不是優雅多了呢?不只比較子,連for-each迴圈都變得更精簡、更直覺了!透過Lambda Expression的寫法,Java程式的語法得以更精簡、更容易上手,可讀性跟維護性當然也跟著大幅提升。
您可在下列課程中了解更多技巧喔!
相關學習資源
【SL-110-SE8】Java SE8初階程式設計