[英]Anything in Guava similar to Functional Java's Effect?
我知道純函數式編程的目標之一是消除可變性,從而排除副作用。 但是讓我們面對現實吧,即使存在所有的函數式編程庫,Java也不是一種函數式語言。 事實上,似乎有些FP庫知道並期待這一點。 例如,在Functional Java中,有Effect
類。 在Jedi FP庫中,有Command
接口。 這允許您 - 除其他外 - 將類型安全的命令模式應用於Iterable
元素,而不需要令人討厭的for循環樣板。
Command<PhoneNumber> makeCall = new Command<PhoneNumber> {
public void execute(PhoneNumber p) { p.call(); }
}
List<PhoneNumber> phoneList = ...
FunctionalPrimitives.forEach( phoneList, makeCall );
所以問題是,番石榴中有類似的東西嗎?
在接受澄清后接受回復
我正在開發一個框架 ,它可以幫助解決大多數Java FP庫中固有的“垂直問題”,在某些情況下。 所以,我不會實際上使如上圖所示的代碼示例:即明確宣布一個新的類實現的Command
其所有的垂直噪聲過甜的煩躁,只需在聲明之后立即應用它的目的。
我更多地考慮實際的命令模式,其中可能有幾個可能的命令在其他地方聲明,並且只有其中一個被傳遞到想要迭代應用它的代碼中。 此外,我的框架的目標是使創建功能接口對象(函數,謂詞,命令,其他簡單的lambda)更加慣用,而不是簡單地將垂直問題移到別處。 我早就意識到這不在番石榴的范圍內。 但是由於其他FP庫中有類似Command的接口,我只想知道Guava中是否存在模擬。
使用我的框架的更完整的代碼示例可能是這樣的:
class Stuff {
private final Stuff CALLS_TO = callsTo(Stuff.class); // a proxy
public static final Command<Stuff> CMD1 = commandFor(CALLS_TO.someMethod1());
public static final Command<Stuff> CMD2 = commandFor(CALLS_TO.someMethod2());
// methods exist for use elsewhere, but are conveniently also wrapped as commands
public void someMethod1() {...}
public void someMethod2() {...}
}
class Activity {
public void handleIt(List<Stuff> stuffs, Command<Stuff> doCmd) {
doSomeThings();
...
forEach(stuffs, doCmd);
...
doOtherThings();
}
}
不!
Guava項目負責人Kevin Bourrillion對Guava的功能特性說:
“語法很糟糕。 與此同時,這些東西現在,一直都是,並且將永遠只是一個權宜之計,直到正確的語言變化出現,此時我們終於可以真正決定最佳語法並開始功能式編程實際上,在Java中讓生活變得更好。 所以我決定投入功能/謂詞的工作量是多少; 它更像是在圖書館,因為它必須是,而不是因為我們認為它是一個皇冠上的寶石。“
當Java 8出現時,我們可能會大大改變我們的策略,但這還不會有一段時間。
此外,我們還沒有發現很多用例,我們認為您描述的Command
接口是最佳解決方案。 例如,我們認為您的上述代碼可以更好地編寫為
for(PhoneNumber phone : phoneList) {
phone.call();
}
老式的方式。 我們可能會相信Command
的優點,但我認為“for-each”用例幾乎總是以老式的方式做得更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.