《Java 8函數語言程式設計》選讀:為什麼要給Java 8中加入函數語言程式設計?

群峰發表於2014-05-25

本文是Java 8 Lambdas 第一章部分譯稿,發上來讓社群的朋友們先睹為快。

在開始我們的lambda表示式之旅前,起碼得知道它因何而生。本章將會介紹lambda表示式產生的原因,以及作者寫這本書的動機和全書的組織結構。

1.1 為什麼需要再次修改Java?

1996年1月,Java 1.0釋出了,此後計算機程式設計領域發生了翻天覆地的變化。商業發展需要更復雜的應用,大多數程式都跑在更強大的裝備多核CPU的機器上。帶有高效執行期編譯器的Java虛擬機器(JVM)的出現,使得程式設計師將精力更多放在編寫乾淨、易於維護的程式碼上,而不是思考如何將每一個CPU時鐘、每一位元組記憶體物盡其用。

多核CPU的出現成了“房間裡的大象”,無法忽視卻沒人願意正視。演算法中引入鎖不但容易出錯,而且消耗時間。人們開發了java.util.concurrent包和很多第三方類庫,試圖將併發抽象化,用以幫助程式設計師寫出在多核CPU上執行良好的程式。不幸的是,到目前為止,我們走得還不夠遠。

那些類庫的開發者使用Java時,發現抽象的級別還不夠。處理大資料就是個很好的例子,面對大資料,Java還欠缺高效的並行操作。Java 8允許開發者編寫複雜的集合處理演算法,只需要簡單修改一個方法,就能讓程式碼在多核CPU上高效執行。為了編寫並行處理這些大資料的類庫,需要在語言層面上修改現有的Java:增加lambda表示式。

當然,這樣做是有代價的,程式設計師必須學習如何編寫和閱讀包含lambda表示式的程式碼,但是,這不是一樁賠本的買賣。與手寫一大段複雜的、執行緒安全的程式碼相比,學習一點新語法和一些新習慣容易很多。開發企業級應用時,好的類庫和框架極大地降低了開發時間和成本,也掃清了開發易用且高效的類庫的障礙。

對於習慣了物件導向程式設計的開發者來說,抽象的概念並不陌生。物件導向程式設計是對資料進行抽象,而函數語言程式設計是對行為進行抽象。現實世界中,資料和行為並存,程式也是如此,因此這兩種程式設計方式我們都得學。

這種新的抽象方式還有其他好處。很多人不總是在編寫效能優先的程式碼,對於這些人來說,函數語言程式設計帶來的好處尤為明顯。程式設計師能編寫出更容易閱讀的程式碼——這種程式碼更多地表達了業務邏輯,而不是從機制上如何實現。易讀的程式碼也易於維護、更可靠、更不容易出錯。

在寫回撥函式和事件處理器時,程式設計師不必再糾纏於匿名內部類的冗繁和可讀性,函數語言程式設計讓事件處理系統變得更加簡單。能將函式方便地傳遞也讓編寫惰性程式碼變得容易,只有在真正需要的時候,才初始化變數的值。

Java 8還讓集合類可以擁有一些額外的方法:預設方法。程式設計師在維護自己的類庫時,可以使用這些方法。

總而言之,Java已經不是你祖父當年使用的Java了,嗯, 這不是件壞事。

1.2 什麼是函數語言程式設計?

一千個人心中,就有一千種對函數語言程式設計的理解。但其核心是:在思考問題時,使用不可變物件和函式,函式將一個值經過處理,對映成另一個值。

不同語言社群的人總是傾向於對自己語言的特性敝帚自珍。現在談Java程式設計師如何定義函數語言程式設計還為時過早,但是,這根本不重要!我們關心的如何寫出程式碼,而不是符合函式程式設計風格的程式碼。

在本書中,我將重點放在函數語言程式設計的實用性上,包括那些可以被大多數程式設計師理解和使用的技術,幫助他們寫出易讀、易維護的程式碼。

相關文章