web-dev-qa-db-ja.com

flatMapとif else vs結合フィルター

リアクティブフレームワークを使用する場合、転送するストリーム(この場合はrxjava)を相互に排他的に選択するために、以下の両方のソリューションを確認しました

Observable.merge(
  Observable.just(aBoolStatement).filter(aBoolean -> aBoolean).flatMap(aBoolean -> signal1),
  Observable.just(aBoolStatement).filter(aBoolean -> !aBoolean).flatMap(aBoolean -> signal2)      
)

-

Observable.just(aBoolStatement).flatMap(aBoolean -> {
  if(aBoolean)
    return signal1
  else
    return signal2
}

最初のコードはすべてrx(ニース)ですが、ステートメントを2回評価するため、ステートメントを更新する必要がある場合は見落としがちです。これを行う好ましい方法または同じ結果を達成するための他の方法はありますか?

5
Erik Johansson

これはおそらく入力サイズに大きく依存しますが、最初の例は間違いなくもっと不必要な作業を行っています。入力twiceをフィルタリングしてから、すべてをマージして戻す必要があります。 2番目の例では、すべてを1つのパスで取得します。

また、2番目はかなりエレガントなワンライナーとして書くことができます(これはScalaであると想定しています)。

Observable.just(aBoolStatement).flatMap(b -> if(b) signal1 else signal2)

これは、ifがScalaで値を返す式であるため、各ブランチにreturnキーワードを含めることは冗長です。このようにifを使用することは、3項式(b ? signal1 : signal2)その構文をサポートする別の言語。

6
KChaloux