12

ドクター曰く

概念的には、これは Single と Completable の結合であり、0 または 1 のアイテム、または何らかのリアクティブ ソースによって通知されたエラーが存在する可能性のある放出パターンをキャプチャする手段を提供します。

しかし、それが本当に何を意味するのかはわかりません。java8 のようOptionalです。

Maybe次の 2 つのコードは結果は同じですが、何ができて何がOptionalできない (または面倒な)のかわかりません。

  @Test
  public void testMaybe1() {
    Observable.just(3, 2, 1, 0, -1)
      .map(i -> {
        try {
          int result = 6 / i;
          return Maybe.just(result);
        } catch (Exception e) {
          return Maybe.empty();
        }
      })
      .blockingForEach(maybe -> {
          logger.info("result = {}", maybe.blockingGet());
        }
      );
  }


  @Test
  public void testMaybe2() {
    Observable.just(3, 2, 1, 0, -1)
      .map(i -> {
        try {
          int result = 6 / i;
          return Optional.of(result);
        } catch (Exception e) {
          return Optional.empty();
        }
      })
      .blockingForEach(opt -> {
          logger.info("result = {}", opt.orElse(null));
        }
      );
  }

結果は同じです:

result = 2
result = 3
result = 6
result = null
result = -6

rxJava1 で、自分の API が返しObservable<Optional<T>>ていたのは、 悪臭ですか? に変更する必要がありObservable<Maybe<T>>ますか?

4

4 に答える 4

27

Maybeいずれかを持つことができる操作/イベントのラッパーです

  1. 単一の結果
  2. 検索結果はありません
  3. エラー結果

ただし、Optional は、次のいずれかののラッパーです。

  1. 現在
  2. 不在

あなたの例では、map操作では、計算は同期的であり(つまり6/i、同期的であり、すぐに値が得られる可能性があります)、値(除算が可能な場合)または空の値(除算が不可能な場合)を伝播します。したがって、使用Optionalする方が理にかなっています。

ただし、他のオプションもあります。

  • 除算ができない理由を伝播したい場合は、発生した例外を報告する必要があります。そのような場合は、 を使用Maybeする方が理にかなっています。
  • 空の値とエラーの理由の両方に関心がない場合は、それらの結果の伝播をスキップするだけです。このようなシナリオでは、 のflatMap代わりにを使用しmapます。Optionalその後、またはを使用する必要はありませんMaybe

    .flatMap(i -> { 
      try { 
        int result = 6 / i; 
        return Observable.just(result); 
      } catch (Exception e) { 
        return Observable.empty(); 
      } 
    }) 
    

MaybeObservable複数の値を発行できるが、たとえば最初の値のみに関心があるためfirstElement()、Observable で演算子を使用する場合にも役立ちます。これは、単一の値があるか、値がない (ソース Observable が完了する前に値を発行しない場合)、またはエラーがある (ソース Observable が値を発行する前にエラーが発生した場合) ため、Maybe を返します。

于 2016-11-05T21:01:25.310 に答える
11

Maybe0 または 1 の遅延ストリームです (ストリームであるとエラーが発生する可能性があります)。Optional怠惰ではなく、存在するか存在しないかのどちらかです。Optionalがあるのに対し、 には遅延計算の意味がありませんMaybe

于 2016-11-07T03:38:24.627 に答える
6

あなたの質問に関連する違いは、Maybeエラーを伝播できるのにOptionalできないということです。あなたの例では、エラーと空の結果を区別できません。エラー処理が重要な場合Optionalは役に立ちませんMaybeが、 Maybe.error(Throwable). APIに関しては、あなたのユースケースでは私が好むでしょうSingle-Maybeそれはエラーまたは単一の結果をもたらすため、戻り値の型はObservable<Single<T>>

于 2016-11-05T16:36:16.287 に答える
2

RxJava 2 は Java 6 をターゲットにしています。つまり、組み込みOptionalサポートは保証されておらず、独自のものを用意する必要があります。独自のFunctionタイプを持ち込む方法と同様です。

アプリケーション/ライブラリが Java >= 8 のみをサポートしている場合は、自分に合ったものを使用できます。

于 2016-11-05T15:05:51.873 に答える