Java 8ではコンシューマの条件付き合成が可能ですか?基本的に私はコンシューマーに似た独自のラムダインターフェイスを作成しようとしていますが、これはあるタイプのオブジェクトでのみ動作します。 (私たちは、この例の目的のための2つを言うでしょう)、のはそれを呼び出すStateful
をしてみましょう、それは複数の状態が含まれていますJava 8ステートフルコンシューマ
public class Stateful {
private int status1;
private int status2;
}
私たちは、ステートフルと上の操作を行う我々のコード内の領域の多くを持って、ステータスが変更された場合は、別の操作を行います。よりコンパクトでエレガントな方法でこれを処理するために合成を使用できるかどうか、私は疑問を抱いていました。
私はこのようなものがよく見えると思うSimpleEntry<Integer, Integer> oldStates = new SimpleEntry(stateful.getStatus1(), stateful.getStatus2());
applyLogicOnStateful(stateful); //do some operation that may change state values
if(isStatusChanged(oldStates, stateful) { //compare oldStates integers to status integers
doSomethingElse(stateful);
}
:今、私たちのようなものだろう
statefulConsumer
.accept((stateful)->applyLogicOnStateful(stateful))
.ifStatusChanged((stateful)->doSomethingElse(stateful));
を私たちからの状態の変化を追跡することができるかどうかはわかりません最初の消費者の前に。たぶん、入力として2人の消費者を必要とするラムダを作成する必要がありますか?
サードパーティの図書館の助けを借りずにこれを行うことは間違いありませんが、役立つ場合はここで宣伝してください。
これを行うための「コンパクトでエレガントな」方法は、例えば、完全に正常な、読み込み可能な 'if'ステートメントを使用します。 –
私は敬意を表して同意しません。変数を状態に保存して、ロジックを実行してから、比較を大量に行い、間違いなくDRYではありません。私は、しかし、状態が変更された場合は、ブール値を返す変更された消費者を持つことができると思います。 – IcedDante
私はこれを行う唯一の方法は、あなたのステータスが変更された場合、またはあなたのすべての操作を呼び出す前に期待値を使って述語を作成する場合、applyLogicOnStatefulがbooleanを返すかどうかです。 ) –