簡體   English   中英

Guava中的任何東西都類似於Functional Java的效果?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM