繁体   English   中英

rxjava2的Maybe和Optional有什么区别?

[英]What's the difference between rxjava2's Maybe and Optional?

医生说

从概念上讲,它是Single和Completable的联合,提供捕获排放模式的方法,其中可能存在0或1项或由某些反应源发出的错误信号。

但我不确定它的真正含义。 看来它是java8的Optional

以下两个代码具有相同的结果,但我不知道Maybe可以做什么和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>>吗?

Maybe是一个可能有任何一个操作/事件的包装器

  1. 一个结果
  2. 没有结果
  3. 错误结果

但是Optional是包含的包装器

  1. 当下
  2. 缺席

在您的示例中,在map操作中,计算是同步的(即6/i是同步的并且可以立即生成值)并且您希望传播值(如果可以除法)或空值(如果不可能除法) )。 因此使用Optional更有意义。

但是还有其他选择:

  • 如果要传播为什么不能进行除法,那么您需要报告发生的异常。 在这种情况下使用Maybe会更有意义。
  • 如果您对空值和错误原因都不感兴趣,那么您只想跳过传播这些结果。 在这种情况下,我会使用flatMap而不是map 然后,我将不必使用OptionalMaybe任何一个。

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

当你有一个可以发出多个值但你感兴趣的ObservableMaybe只有第一个值,因此你可以在Observable上使用firstElement()运算符。 这将返回一个Maybe,因为要么存在单个值,要么没有值(如果源Observable在完成之前未发出任何值)或者存在错误(如果在发出任何值之前发生源Observable错误)。

Maybe是零或一件事的懒惰流(并且流可能导致错误)。 Optional不是懒惰,它存在或不存在。 使用Optional没有延迟计算的意义,而有Maybe

与您的问题相关的差异是, Maybe可以传播错误而Optional可以传播错误 - 在您的示例中,无法区分错误和空结果。 如果错误处理很重要,则Optional无用,而MaybeMaybe.error(Throwable) API方面,对于您的用例,我更喜欢Single to Maybe - 因为它产生Error或单个Result,因此返回类型将是Observable<Single<T>>

RxJava 2针对Java 6.这意味着没有内置的Optional支持保证,他们必须自带。 类似于他们必须携带自己的Function类型。

如果您的应用程序/库仅支持Java> = 8,您可以使用更适合您的任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM