因多次安全問題而延期了5個月之後,甲骨文如期在3月18日釋出了Java SE 8正式版。新版最大特色是納入了Lambda表示式(Lambda Expression)的支援,這是甲骨文接手Java後的第二次大改版,也是最大一次的更新,不只提供了新的語法,也增加了新的API。

Java作家林信良表示,Lambda不只簡化了Java語法,也讓Java 8更容易開發平行運算的程式碼。

林信良以語法蜜糖來形容Lambda簡化語法的效果,他解釋,在Java撰寫匿名類別(Anynomous Class)語法時,必須寫出介面名稱和方法名稱,但在閱讀程式碼時,名稱重要性不高,開發者關心傳入參數、傳出結果和方法的細節,但因很多介面支援泛型,匿名類別語法不得不用泛型語法時,程式碼會非常瑣碎。若開發者不需要注重介面名稱方法名稱時,改用Lambda語法後,可以大幅簡化程式碼,甚至可以連參數型態都不用宣告,能簡化匿名類別語法來提高可讀性。因為Java 8的Lambda表示式是全新的語法,採用了Lambda語法的程式碼將無法向下相容舊版Java。

引進函數式程式設計典範的開發觀念

不過,林信良認為,這還不是Java 8最根本的改變,更重要的是引進了函數式程式設計典範(Functional Programming)的觀念,例如將資料處理流程分而治之,先切割成小任務,在將每個小任務的處理結果合併。Lambda除了表示式之外,還增加了新的Stream API。開發者可以用Stream API來處理序列式的程式操作,只要將Stream API替換成parallelStream API,Java 8就能改用平行運算架構來執行原本的程式。這也大幅簡化了原本開發平行運算程式需要的程式碼。

他認為,要能發揮Java 8提供的平行運算開發能力,Java開發者得改變傳統的開發習慣,「要懂得讓程式碼一次做一件事的觀念,也就是將複雜的大型程式,切割成許多小任務程式的作法,另外還要留意程式執行順序,必且避免在小程式執行時對來源資料的干擾。」

Java終於內建日期與時間API

另一個重要的更新則是Java 8增加了新的日期與時間處理API。Java過去沒有這類內建函數,因為日期和時間處理有很多例外,例如臺灣早期曾實施日光節約時間,若沒有逐一納入這些日光節約時間的資訊,日期處理就會有發生錯誤的時候。所以,許多Java開發人員得使用第三方日期函式庫來解決這個需求。不過,Java 8內建這類API後就不用再依靠第三方函式庫,林信良表示,能減少對第三方函式庫的依賴,降低程式碼維護負擔。

Java 8還新增了不少新功能,例如可支援容量小於3MB的JVM,讓Java能在更低階的裝置上執行,也採用了效能更快也更輕量化的新Javascript引擎Nashorn等。目前臺灣Java使用仍以Java 6為大宗,因為RedHat推動的OpenJDK仍會繼續支援Java 6,也延長了Java 6的壽命,林信良表示,對於沒有版本相容考量需求的新應用,可以直接採用Java 8來善用新特性。


Java 8最新Lambda語法示範
List<String> names = Arrays.asList("Justin", "Monica", "Irene");
// 採用Java 7語法的反序排列匿名類別語法
lists.sort(names, new Comparator<String>() {
    public int compare(String name1, String name2) {
        return -name1.compareTo(name2);
    }
});
// 改用為Lambda語法後的寫法
lists.sort(names, (name1, name2) -> -name1.compareTo(name2));
資料來源:林信良,iThome整理,2014年3月

熱門新聞

Advertisement