2016-05-18 16 views
8

私はJava 8を初めて使用しています。私はConsumer java docに出会いました。「コンシューマーは副作用によって動作することが期待されています。誰かがなぜそう言われたのか説明してもらえますか?Java 8コンシューマーと副作用

+3

関数型プログラミングに慣れていない場合、その言語はあまり意味がありません。考えられるのは、 "純粋な"関数は入力からのみ読み込み、戻り値に書き込むべきであるということです(副作用はありません - 関数を実行する唯一の効果は戻り値を得ることです)。何か(データ構造の変更、IOの実行など)は、副作用があると言われています。戻り値のない関数は、副作用がある方が良い、そうでなければ何もしていない。 –

答えて

4

Consumer javadocによれば、消費者は、署名がvoid accept(T)であると宣言されなければならない。その結果、メソッドは値を返すことができません。それが副作用を持たないなら、それはどんな影響をも実行する能力を持たないでしょう。厳密に彼らは、入力を受け入れるいくつかの計算を行い、出力を返す意味機能インターフェース、 -

+0

ありがとうございます。私はあなたの意見を持っています。 – user6348242

0

ほとんどの機能インタフェースは、まさにそれであることを意味しています。彼らはどんな状態も修正するつもりはない。 Consumerは値を返さないため例外です。その目的はある状態を変更することだけです。

7

消費者は次のシグネチャ

void accept(T t); 

方法は、入力としてトンを取り、何も(ボイド)返さない、ので、あなたはそれから何かを返すと方法を置き換えることはできませんと方法acceptを持っていますそれが返す値で呼び出します。

副作用でしょうprint文の例、

list.stream.foreach(System.out::println); 

foreachのは、引数として消費者を取ります。あなたがそれについて考えるならば、あなたがそのような方法で行うことができる唯一の有用なことは、世界を変えることです(すなわち、状態を変える)。

pure function、任意の状態を変化させません機能は、それが任意の副作用はありません。たとえば、ここで

Function<Integer,Integer> fn = x -> x*x; 

fnため、入力を受け取り、何かを返すだろうとの反対(それは何かを変異させない)、それは整数を受け取り、静かにその正方形を返す。