我想在我將教授的課程中使用Functional Java或Guava(或不太可能的Scala)。儘管在JVM上運行的函數語言很多,但我仍想堅持一些看起來儘可能像Java一樣的東西,也就是說,它們在概念上和語法上最兼容,具有Java 8中預期的功能特性功能性Java和番石榴之間有很好的比較嗎?
看起來像Functional Java和Guava是最好的候選人。在能力,易用性,對直接Java的概念性接近性等方面,我還沒有找到任何比較它們的方法。有誰知道這些庫之間有很好的比較嗎?
我想在我將教授的課程中使用Functional Java或Guava(或不太可能的Scala)。儘管在JVM上運行的函數語言很多,但我仍想堅持一些看起來儘可能像Java一樣的東西,也就是說,它們在概念上和語法上最兼容,具有Java 8中預期的功能特性功能性Java和番石榴之間有很好的比較嗎?
看起來像Functional Java和Guava是最好的候選人。在能力,易用性,對直接Java的概念性接近性等方面,我還沒有找到任何比較它們的方法。有誰知道這些庫之間有很好的比較嗎?
番石榴的目標不是提供Java中的功能性成語。從Functional Explained番石榴wiki頁面:
過度使用番石榴的函數式編程成語的可導致 冗長,混亂,不可讀,和低效的代碼。這些是迄今爲止最容易(也是最常見)番石榴被濫用的部分,而當你爲了使你的代碼成爲「單線」而荒謬的長度時,番石榴團隊會哭泣。
請確定,在使用番石榴的功能性實用程序時, 傳統的做事方式不可讀。試試 寫出來。那麼糟糕?比你想嘗試的荒謬尷尬的功能方法更具可讀性嗎?
由於負擔過重(參見vertical problem),過度依賴功能成語使Java 7不太瞭解。這將隨着Java 8而改變,這將改變Java庫和程序在細節層面上的設計方式。在Java 8中,對於Java而言有意義的東西在某種程度上會受到阻礙。這將激發新版本的Effective Java和許多新的API。
如果你想教功能性編程,最好堅持一個(或多或少)純功能語言。每種語言都是FP和OOP的混合語言(或模擬語言)將會讓人分心。
我還應該指出這篇文章中的前面的句子: 「從Java 7開始,Java中的函數式編程只能通過笨拙和冗長的匿名類來使用,這在Java 8中有望改變,但Guava是目前針對Java 5及以上版本的用戶。「 – 2011-12-23 10:51:40
如上所述,Guava只是一個Java庫 - 與Java 5兼容的庫,甚至(從版本11開始)。 Guava在函數式編程中的位置由Kevin Bourrillion總結:
「語法很糟糕。與此同時,現在這種東西,一直是,而且永遠只是一種權宜之計,直到正確的語言變化才能出現,那時我們終於可以真正地決定最佳語法,並開始功能式編程實際上讓Java的生活更美好一次。所以我不確定要在功能/謂詞中加入多少功夫;它在圖書館更多,因爲它必須是,而不是因爲我們認爲它是一顆皇冠上的寶石。「
由於Guava更像是一個具有功能性慣用語的通用庫,而Functional Java純粹是關於在Java中實現功能語言,Functional Java聽起來更適合於更完整的FP類功能。
另一方面,我更喜歡番石榴,因爲它更通用,因此我發現自己使用了幾個與功能性成語無關的功能。
這兩個庫的問題之一(如上文中的Guava's Wiki所述)是函數對象的匿名內部類的「垂直噪聲」。另一個試圖通過註釋和APT修復此問題的庫是Jedi。
另一種讓上述庫(Guava,FJ或Jedi)沒有註釋的低噪聲庫的方法是我編寫的庫,Funcito,靈感來自Mockito的語法。它在這一點上可以簡化的更加有限,基本上包裝了單一的方法調用,但這正是我目前發現自己大部分時間都在做的事。
當你的意思是垂直噪音。你是在談論冗長的編碼,因爲它涉及到在創建一堆字節碼類文件時在你的jar庫中添加匿名內部類或開銷? – 2012-02-09 21:18:55
前者:匿名內部類。 – 2012-02-10 01:51:13
這裏有什麼問題?你可能想編輯你的問題,使其更清楚你問的是什麼... \ [編輯\]問題在標題中,是的,但是你可能想在Q中重新修飾它。 – BenCole 2011-12-22 20:18:20
番石榴只是一個有很多有用的實用方法的Java庫。是的,它確實有一些東西可以讓你以功能方式進行編程,但它並不特別專注於函數式編程。 – Jesper 2011-12-22 20:45:55
感謝您的答案。我錯誤地理解了番石榴的目標。我還花了一點時間來研究Functional Java。它也是(仍然)被當前的Java語法壓低。這導致我現在傾向於Scala。我意識到Scala正在變得越來越主流。即使如此,我認爲對於大多數學生來說,學習如何在直接Java中進行函數式編程將是最有價值的。 (當我們把函數式編程作爲一個「範式」來使用時,我們使用Haskell,但我懷疑學生們是否學到了足夠的東西,但要把它帶入他們的血液中。)這引出了一個問題:什麼時候Java 8有望? – RussAbbott 2011-12-24 16:22:06