《Java 8函數語言程式設計》作者Richard Warbourton:Java的亮點不是語言本身(圖靈訪談)

盼盼姐發表於2015-06-09

Richard Warburton是一位經驗豐富的技術專家,善於解決複雜深奧的技術問題,擁有華威大學電腦科學專業博士學位。近期他一直從事高效能運算方面的資料分析工作。他是英國倫敦Java社群的領導者,組織過面向Java 8中Lambda表示式、日期和時間的Adopt-a-JSR專案,以及Openjdk Hackdays活動。Richard還是知名的會議演講嘉賓,曾在JavaOne、DevoxxUK和JAX London等會議上演講。根據對Java社群和Java 8新特性的深刻理解,他創作了《Java 8函數語言程式設計》一書。

問:你是如何成為一位程式設計師的?又如何成為一位擅長Java的程式設計師?

一直以來我都對科技很感興趣,在學校的時候我交友不慎,和程式設計師群體成為了朋友。能遇見這些可以製作有用又有趣東西的人還是還是很不錯的。所以我從一本關於Visual Basic的書學起(這是我學的第一種程式語言),讀完了就開始敲程式碼。隨後我發現Visual Basic作為一種程式語言還有很多讓人不滿的地方,在大學的時候,我學習了Java。雖然我也用過其他程式語言,但是最終我總是重新回到Java。相比於語言本身,更吸引我的是Java已有的生態環境、工具,以及庫。

問:你在倫敦Java社群的經歷是否幫助你創作了《Java 8函數語言程式設計》這本書?

絕對是這樣。通過組織倫敦Java社群“黑客日”關於Java 8的活動,我把反饋傳送給了專家組,所以在Java 8正式釋出之前,我就已經擺弄過Java 8的原型。同時,我也在倫敦的活動中接觸到了O'Reilly,如果沒有倫敦Java社群,《Java 8函數語言程式設計》這本書就不會存在。

問:lambda在JVM中是不可見的,為什麼沒有通過把lambda做成外掛來支援這一語法特性,而是把lambda融合到了Java 8中?

我認為這是很多其他關於Java 8的設計決策造成的結果。他們很早就已經確定,不會增加特殊函式型別來代表lambda——而是使用具有單一抽象方法的介面(函式式介面)。一旦如此,任何想要呼叫lambda表示式的庫只要呼叫一個介面的一個方法就可以了。要實現這些我們不再需要改變位元組碼。

為了讓lambda工作而搞出一堆技術結構來是沒有任何意義的,在我共同執筆的文章中,我詳述了這個觀點:http://www.infoq.com/articles/Java-8-Lambdas-A-Peek-Under-the-Hood

問:Scala、Groovy及Clojure從根上就有函式化程式設計基因,與它們相比Java是否具有哪些獨特的優勢?

當然有,但是亮點不在語言上!Java是一種絕對可靠的語言,但是像Scala這樣的語言總是可以新增更多的特性。Clojure永遠都會更簡單,語法更少、概念更少。Groovy能夠混合著提供靜態型別和動態型別,同時也能提供Java所或缺的指令碼處理。相比於Java,所有這些語言都有其獨特的吸引力,但是同時它們也缺少很多其他東西。

Java擁有優秀而成熟的工具,同時它對IDE的支援也是像Scala和Clojure這樣的語言所缺少的。對於我來說,這些工具對生產效率的影響和語言本身一樣重要,好的工具可以幫你掃除很多日常開發中的麻煩。因為有這些強有力的工具,在很多專案上我都會優先選擇Java,而不是Scala或Clojure。

問:Java的最大優勢在於穩定和簡單,Java 8的函式化程式設計以及Java 9的多繼承機制會不會導致Java的複雜度提升、程式碼的維護度成本提高?

這取決於你看問題的角度。我認為引入函數語言程式設計會為很多程式設計任務提供方便。採集和資料處理是Java程式設計師經常需要完成的任務,而函式式正規化是解決這類問題的理想手段。確實,學習這些新概念確實會造成額外的成本,同樣,當你需要決定編寫函式式程式碼還是命令式程式碼時確實會增加其複雜性。所以對於我來說並沒有一個絕對的答案。函數語言程式設計會讓問題更簡單,但是需要學的還有很多。

問:目前Java生態對Java 8函數語言程式設計的支援情況如何?作為新特性,您預測Java 8函數語言程式設計進入全面使用大概還需要多長時間?

如果你想要採用Java 8的話,就需要一步一步慢慢來。首先考慮的是和lambda表示式一起聯合使用核心庫特徵,比如資料流(Stream)和採集器(Collector)。我認為我們現在已經進入了逐步採用的階段,我已經見到很多人把這些特性用在了真實的程式碼中。

隨著時間推移,我相信我們即將看到Java演進成更具有函式式風格的語言——使用某些函式式設計模式,更多的不可變類。已經有一些庫開始採用這樣的樣式。我編寫了一個測試框架(http://richardwarburton.github.io/lambda-behave/)作為例子拋磚引玉,還有很多其他東西可以做。

所以我的結論是最終Java 8的函式式特性會得到全面採用,但是這是一個循序漸進的過程。

問:之前的Java是物件導向的,現在全面支援函數語言程式設計。作為開發者,我們需要做出哪些轉變才能發揮函數語言程式設計的力量?

我認為這個轉變需要幾步來完成。

第一步,學習更多關於Java 8的知識。讀書、讀tutorial,然後嘗試幾個簡單的函式式程式碼的例子。掌握了基礎之後,就可以進行第二步了。

第二步,在工作專案上使用Java 8。我覺得在一個低風險的小專案上練一練手確實不錯,但是在真實商業世界的背景下解決問題效果則更好。一旦你在真實世界的設定下熟悉了Java 8,就可以移步到第三步了。

第三步,把所有程式碼部署到Java 8上,並在不使用任何Java 8特性的前提下對其進行全面測試。這樣做是因為雖然Java SE維護了很強大的二進位制相容性,但是某些第三方庫可能會崩潰,那時你就必須得升級這些庫。如果你已經使用了最新的庫,那麼這一步對你來說就不成問題。一旦萬事俱備,就可以開始第四步了。

第四步,在你整個主程式碼庫上使用Java 8,並且樂在其中。

問:在你使用Java進行函數語言程式設計的過程中,是否有哪些最佳實踐值得推薦?一路上是否遇到過哪些坑?

我從來都不太喜歡“最佳實踐”這個詞,這些東西都是隨著時間變化的,而且依賴於不同背景。但是我們可以來說一說那些用起來得心應手的好東西。

  1. 資料流(Stream)和採集器(Collector)。如果你編寫的程式碼需要採集API,那麼這些特性就是你最好的朋友。

  2. 不可變資料。一般來說,返回新的物件比改變已有的物件更簡單,也更不容易出錯。

  3. 函式式思考方式。與其想“我怎麼才能升級這個Blob的狀態?”不如問自己:“我怎麼才能把這個輸入轉為輸出呢?”


更多精彩,加入圖靈訪談微信!

相關文章