純粋な関数型プログラミングの目標の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();
}
}
"旧式の"方法はコマンドでは優れていますが、フィルタや変換ではそれほど優れていないのはなぜですか?また、機能的な機能はJava 8まで停止ギャップとみなされていますが、Java 8は時間がかかることに気がつく必要があり、その採用は即時にはできません。まだプロジェクトがJava 5を抱えています(幸運にも、私のものではありません)。 –
[the user guide](http://code.google.com/p/guava-libraries/wiki/FunctionalExplained#Caveats)を読んだら、昔ながらの方法でフィルタやほとんどの場合、変換が行われます。時間のすべてではありません - なぜ我々はそれらの機能を提供するのですか?しかしほとんどの時間。 –
さらに、元の郵便のコードは、[Guava team weep](http://code.google.com/p/guava-libraries/wiki/FunctionalExplained)の一例です。 –