2012-06-28 49 views
0

我想效仿如下界面:如何模擬多參數副作用功能

interface MultiSideEffectFunction<T> { 
    void action(T first, T second); 
} 

(它會救我脫離不必引入一個新的接口)

是有首選番石榴的方法來做到這一點?

注:我想和

Function<Pair<T>, Void> 

這樣做,但這裏有兩個問題,這使得最好創建一個新的接口:

  1. 我們必須定義一個名爲Pair<T>類,它看起來很像一個Map.Entry<T, T>更合適的getter名稱(作爲第二個問題:是否有像這樣的Guava類型?)。
  2. Void返回類型總是很痛苦 - 最好是有一個真正的void簽名。

回答

5

番石榴的貢獻者在這裏。

首選的Guava方法是編寫自己的界面。

特別是,不是使用Function;只有當功能沒有副作用時才應使用Function

番石榴故意缺少Pair類型;我們建議任何時候你需要一對,你創建自己的類,將有用的名稱附加到這兩個值上,而不是完全無信息的「第一」和「第二」。 (原型的例子是GPS座標;一個名爲LatLong的類比Pair<Double, Double>更具信息性。)

3

番石榴團隊不會對他們只提供基本功能成語和他們不感興趣重新創建一個完整的功能性編程API。爲此,你可以看看其他幾個API。儘管副作用與純函數式編程模型是對立的(我認爲這很好,因爲Java是永遠不會即使在後面也會成爲真正的函數式語言lambda表達式)。

但無論如何,作爲一個示例API,Jedi提供了Command類正是你正在尋找的。在Functional Java,他們提供了Effect類,我認爲這是類似的事情。

順便說一句,在你的例子中,你可能會想提供多個Type Vars而不是<T>,這樣你的每個輸入類型可能會有所不同。

剛剛編輯爲明顯的錯別字)

+0

感謝凱文 - 絕地告訴我這個消息。但是,我覺得這是一種好奇心,而不是我可能會用到的東西。如果他們打算建立一個圖書館來消化Java,其中包括在編譯階段生成代碼的註釋,那麼我認爲他們最好花時間想出一個基於註釋的解決方案,例如getter/setter/listener (Java中的樣板的第一個原因,恕我直言)。他們還故意通過拒絕使用先進的for循環來膨脹「傳統Java」示例 - 這只是糟糕的營銷並且不會欺騙任何人。 – fommil

+0

OMG,我剛剛發現了[Lombok](http://projectlombok.org/),並且看看我能否在Netbeans/Maven之間正常工作。凱文,我感謝你超過你可能想象的激發我追求這一探索線! – fommil

+0

傑迪的例子的好處...我沒有注意到這一點。我不是編譯時註釋處理的粉絲,這就是爲什麼我開發了一個庫,以便在運行時將函數類對象封裝爲方法,並在像Guava,Functional Java和Jedi之類的庫上工作。 –