主な問題は、内部ループ本体
if (cond(outer, inner))
func(outer, inner);
else
moo(outer, inner);
は、ストリームAPIには対応がなく、最もthinkableソリューションのための単一の不透明なアクションのままなので、最も簡単な解決策はConsumer
としてそれを表現することですforEach
をネストして呼び出すと、既に入れられているループfor
のネストには何のメリットもありません。
あなたはflatMap
ベースのソリューションを強化したい場合は、次のことができます。それは、その人自身がこれらをキャプチャすることができる機能として[outer,inner]
にマッピングするためのペア/タプル型を必要としない
owner.getOuterList().stream().flatMap(
outer -> owner.getInnerList().stream().<Runnable>map(
inner -> cond(outer, inner)?() -> func(outer, inner):() -> moo(outer, inner))
).forEach(Runnable::run);
値。これは内部ストリーム処理の状態を評価するが、外側ストリーム処理ではfunc
またはmoo
のいずれかの実際の呼び出しが行われることに注意してください。外側ストリーム内のすべてを処理するように設定することができます。
owner.getOuterList().stream().flatMap(
outer -> owner.getInnerList().stream().<Runnable>map(
inner ->() -> { if(cond(outer,inner)) func(outer,inner); else moo(outer,inner); })
).forEach(Runnable::run);
これは、元の内側ループのボディを不透明なアクションとして扱います。
私は、元のネストされたfor
ループよりもどちらも本当の勝利ではないことは明らかです。
これらが純粋に必須のものであれば、それはまったく同じように見えます。ストリームは、一般的に_new_要素を変換してフィルタリングして取り出します。 –
うん、@柱のリンクは基本的にあなたが必要なものです。 '内側とnewの両方を保持するためのTupleクラスを常に持っていますが、外側 '。ここでは両方とも 'Object'であるため、配列を乱用する可能性があります...まったく:' for'ループを維持してください。 – Tunaki
よろしくお願いします。Pillar and Tunaki。それを書くためには、はるかにクリーンな方法ではないということがある。 – twentylemon