2017-03-29 4 views
1

私はcompose()のデフォルトメソッドと同等のラムダ式の使用を比較していました。私はラムダ式の代わりにcompose()を使用して唯一の欠点を参照してください質問How to do function composition?を解決するために、2つのアプローチを比較し、しかしラムダ式の代わりにcompose()を使用する理由は何ですか?

hereを指摘して

たぶんその理由は、表現力や機能的なスタイルのプログラミングをコーディングすることに関するものです。

accepted answerに応じcompose()と第一のアプローチ:

Function<Person, Address> personToAddress = Person::getAddress; 
Function<Address, String> addressToCountry = Address::getCountry; 
Function<Person, String> toCountry = addressToCountry.compose(personToAddress); 

ラムダ式と第二のアプローチ:

Function<Person, String> toCountry = p -> p.getAddress().getCountry(); 

私は二番目のを好むのはなぜ?まず、それほど冗長ではありません。第2に、明示的な補助変数personToAddressaddressToCountryは必要ありません。

ラムダを明示的に使用する代わりにcompose()を使用する理由はありますか?

+4

2つ目の関数は、2つの関数が渡されたときに適切です。すなわちそれらは既に存在する。 –

+2

あなたの簡単な例では、人からアドレスを取得する方法と国から住所を取得する方法の両方を知っています。しかし、あなたがアドレスを取得する方法を知らない場合はどうなりますか?もし 'Person'が' List

'を持っていて、あなたが要求しているものが分からないとどうなりますか?次に、クライアントのcallsiteからマッパーを要求し、答えを作成することができます。 –

+1

ニット・ピックするだけで、ローカル変数は厳密には必要ではありません。キャストを使用して、メソッドリファレンスを 'Function'型にリンクすることができます –

答えて

2

1つの理由は、同じコードで関数の1つまたは両方を作成せず、他の場所から関数を渡す場合です。次に、指定された関数にapply()を呼び出すラムダを書くか、おそらくより洗練されたcompose()を使用します。

関連する問題