《Java 8函數式編程》做者Richard Warbourton:Java的亮點不是語言自己

非商業轉載請註明做譯者、出處,並保留本文的原始連接:http://www.ituring.com.cn/article/199271git

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

圖片描述

問:你是如何成爲一位程序員的?又如何成爲一位擅長Java的程序員?github

一直以來我都對科技很感興趣,在學校的時候我交友不慎,和程序員羣體成爲了朋友。能碰見這些能夠製做有用又有趣東西的人仍是仍是很不錯的。因此我從一本關於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的狀態?」不如問本身:「我怎麼才能把這個輸入轉爲輸出呢?」


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

圖片描述

相關文章
相關標籤/搜索