摘要:根據對社區和新特性的深刻理解,他創作了函數式編程一書。問你在倫敦社區的經歷是否幫助你創作了函數式編程這本書絕對是這樣。我認為引入函數式編程會為很多編程任務提供方便。問之前的是面向對象的,現在全面支持函數式編程。
非商業轉載請注明作譯者、出處,并保留本文的原始鏈接:http://www.ituring.com.cn/article/199271
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進行函數式編程的過程中,是否有哪些最佳實踐值得推薦?一路上是否遇到過哪些坑?
我從來都不太喜歡“最佳實踐”這個詞,這些東西都是隨著時間變化的,而且依賴于不同背景。但是我們可以來說一說那些用起來得心應手的好東西。
數據流(Stream)和采集器(Collector)。如果你編寫的代碼需要采集API,那么這些特性就是你最好的朋友。
不可變數據。一般來說,返回新的對象比改變已有的對象更簡單,也更不容易出錯。
函數式思考方式。與其想“我怎么才能升級這個Blob的狀態?”不如問自己:“我怎么才能把這個輸入轉為輸出呢?”
更多精彩,加入圖靈訪談微信!文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64354.html
摘要:后端好書閱讀與推薦系列文章后端好書閱讀與推薦后端好書閱讀與推薦續后端好書閱讀與推薦續二幾個月又過去了,又讀了幾本書,同時為了深切體會到某些書里面的要點還專門做了一個小項目,這里就把讀書與小項目過程中的一些心得體會記錄一下。 后端好書閱讀與推薦系列文章:后端好書閱讀與推薦后端好書閱讀與推薦(續)后端好書閱讀與推薦(續二) 幾個月又過去了,又讀了幾本書,同時為了深切體會到某些書里面的要點還...
摘要:后端好書閱讀與推薦系列文章后端好書閱讀與推薦后端好書閱讀與推薦續后端好書閱讀與推薦續二幾個月又過去了,又讀了幾本書,同時為了深切體會到某些書里面的要點還專門做了一個小項目,這里就把讀書與小項目過程中的一些心得體會記錄一下。 后端好書閱讀與推薦系列文章:后端好書閱讀與推薦后端好書閱讀與推薦(續)后端好書閱讀與推薦(續二) 幾個月又過去了,又讀了幾本書,同時為了深切體會到某些書里面的要點還...
閱讀 902·2023-04-26 02:16
閱讀 1210·2019-08-30 15:55
閱讀 2791·2019-08-30 15:53
閱讀 3385·2019-08-29 15:38
閱讀 2892·2019-08-29 13:42
閱讀 1984·2019-08-26 13:34
閱讀 1842·2019-08-26 10:10
閱讀 3080·2019-08-23 14:40