2017-01-10 4 views
-1

をカリー化私は機能を有し、機能分解の利点と

Double calculate(String A,int B) { 
    if(A.equals("something")){ return B*1.02; } 
    if(B.equals("some")) return B*1.0; 
    else return B; 
} 

レガシーコードに(文字列A、INT B)を計算Bに適用計算は、機能的にはA.

の値に依存しますそして、代わりにcalculate(a,b)を呼び出す私は

を呼ぶだろう

Function<String, Function<Integer,Double>> strategyA = (a)-> { 
    if(A.equals("something")) return b -> b*1.02; 
    if(B.equals("some")) return b -> return b -> b*1.0; 
    else return b -> b; 
} 

:スタイル私にこれを破ることができます0

strategyA.apply(a).apply(b) 

2番目のスタイルは最初のスタイルよりも優れていますか?私の理解によれば、これには戦略パターンと機能的分解とカリングが含まれます。

2番目のアプローチが本当に良い場合は、どのように誰かを説得しますか?

答えて

3

Javaでは、指定されたコードを配信するための好ましい方法は、このメソッドをそのままにしておきます。メソッドを関数として表現する理由はなく、単に「より機能的なスタイル」を持つ必要はありません。関数のサポートがJavaに追加された理由は、コードへの参照を別のメソッドや関数に渡したいことがあるからです。この場合、受信メソッドはカプセル化しようとしているコードではなく、必要な関数シグネチャを定義します。

受信方法は、結果だけに興味がされずにStringとそれにintのペアを渡したいのであれば、あなたのcalculate方法は、ObjIntConsumer<String>と呼ぶことができます。それ以外の場合は、(String,int) → Doubleという署名を表すカスタム関数インタフェースを使用することができます。またはあなたがボクシングを受け入れるときは、BiFunction<String,Integer,Double>が行います。

curryingを使用すると、Functionなどの既存のインターフェイスを再利用して、組み込みインターフェイスが存在しない場合でも、複数の引数を持つ関数を表すことができます。このようなカレット化された関数を使用して、多くの場合、新しい機能インタフェースを定義することは、ほとんどの場合、カリングよりも優先されます。

その他のプログラミング言語では、関数型の構文と型の推論が異なります最初は、機能的なインターフェースを決めるのではなく)、これはまったく異なるでしょう。

2

私は、ほとんどの場合、関数型プログラミングを使うために関数を使ってコードを書くのは意味がないと私はHolgerに同意します。関数はコレクション処理などのコードをより良い方法で書くための追加のツールに過ぎません。

この例では、Stringというパラメータをaとし、計算を実行して別の関数を返すという興味深いことがあります。

Function<String, Function<Integer,Double>> f = (a) -> { 
    if (some-long-computation(a)) return b -> b*1.02; 
    if (some-other-long-computation(a)) return b -> return b -> b*1.0; 
    else return b -> b; 
} 

あなたがString引数でfを起動すると、関数はsome-long-computationsome-other-long-computationを実行し、所望の機能を返します:最初の操作に時間がかかる場合、これは時々役立つことができ

Function<Integer,Double> fast = f.apply("Some input"); // Slow 
Double d1 = fast.apply(123); // Fast! 
Double d1 = fast.apply(456); // Fast! 

fが通常の方法だった場合は、f("Some input", 123)
f("Some input", 456)の2度の呼び出しは、高価な計算を2回実行する。もちろん、これは関数型プログラミングなしでも処理できるものですが、関数を返すことが実際にはきちんと適合する場所の1つです。

+0

あなたはまだ 'Function'を返すメソッドを持つことができます... – Holger

+0

@Holger質問は構文に関するものではなく、直接計算された値の代わりに結果として関数を返すという利点と、複数の関数。 –

+0

Tomasは、これが実際に意味をなされるかもしれない1つのユースケースを明確に述べています。 –

関連する問題