2012-03-01 9 views
5

純粋な関数型プログラミングの目標の1つは、変更可能性を排除することであり、したがって副作用を排除することです。しかし、それに直面してみましょう、Javaは関数型プログラミングライブラリであっても、関数型言語ではありません。実際には、FPライブラリのいくつかがこれを知っていると思われます。たとえば、Functional Javaの場合、Effectクラスがあります。 Jedi FPライブラリには、Commandインターフェイスがあります。これにより、とりわけ、厄介なfor-loopの定型文を使わずに、Iterableの要素にタイプセーフなコマンドパターンを適用することができます。機能的Javaの効果に似たGuavaのものは何ですか?

Command<PhoneNumber> makeCall = new Command<PhoneNumber> { 
    public void execute(PhoneNumber p) { p.call(); } 
} 
List<PhoneNumber> phoneList = ... 
FunctionalPrimitives.forEach(phoneList, makeCall); 

これはグアバのようなものですか?

EDITED状況の特定のセットの下で、明確化

私はほとんどのJava FP-ライブラリに固有の「縦の問題」に役立ちますframeworkを開発していますのために受け入れANSWER AFTER。したがって、私はではなく、は上記のコード例を実際に作成します。すなわち、宣言の直後にただちに適用するという目的で、すべての垂直ノイズの不確定性を持つCommandの新しいクラス実装を明示的に宣言します。

私は実際のコマンドパターンの行に沿って、他の場所で宣言されたいくつかの可能なコマンドがあるかもしれないと考えていましたが、そのうちの1つだけが反復的にそれを適用したいコードに渡されます。さらに、私のフレームワークの目的は、他の場所で垂直問題を単純に動かすことなく、関数インタフェースオブジェクト(関数、述語、コマンド、他の単純なlambda)を作成することをより慣用的にすることです。私は、これがGuavaの範囲にないことを以前から認識していました。しかし、コマンドライクなインターフェイスが他のFPライブラリで利用できるように、私はちょうどアナログが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(); 
    } 
} 

答えて

10

いいえ:

より完全なコード例では、私のフレームワークを使用して、このようなものかもしれません!

ケビンBourrillion、グアバプロジェクトのリーダーは、グアバの機能的特徴に述べている:

を「構文は吸います。同時に、このようなものは今、いつもあり続けてきました。正しい言語の変更が来るまでは、何とかなるでしょう。最終的には、最適な構文を決定し、機能スタイルのプログラミングを開始することができます実際にJavaで一生懸命働いています。ですから、私はFunction/Predicateのものにどのくらいの努力を払うかについては未定です。我々がそれが王冠の宝石だと思うのでそれほど多くではないので、それはライブラリの中にある」

Java 8が登場したときに私たちの戦略は大きく変わるだろうが、そうではないだろうまだしばらくの間。

また、あなたが記述するCommandインターフェイスが最適な解決策であると思われる使用例は多数ありません。たとえば、上記のコードは、従来の方法でははるかに優れていると思われます。

for(PhoneNumber phone : phoneList) { 
    phone.call(); 
} 

昔ながらの方法です。私たちは潜在的にCommandのメリットを確信できますが、 "for-each"ユースケースは、ほとんどの場合旧式のやり方で行われるほうがよいでしょう。

+1

"旧式の"方法はコマンドでは優れていますが、フィルタや変換ではそれほど優れていないのはなぜですか?また、機能的な機能はJava 8まで停止ギャップとみなされていますが、Java 8は時間がかかることに気がつく必要があり、その採用は即時にはできません。まだプロジェクトがJava 5を抱えています(幸運にも、私のものではありません)。 –

+0

[the user guide](http://code.google.com/p/guava-libraries/wiki/FunctionalExplained#Caveats)を読んだら、昔ながらの方法でフィルタやほとんどの場合、変換が行われます。時間のすべてではありません - なぜ我々はそれらの機能を提供するのですか?しかしほとんどの時間。 –

+0

さらに、元の郵便のコードは、[Guava team weep](http://code.google.com/p/guava-libraries/wiki/FunctionalExplained)の一例です。 –

関連する問題