rxjava2的Maybe和Optional有什么区别?

What's the difference between rxjava2's Maybe and Optional?

文档说

Conceptually, it is a union of Single and Completable providing the means to capture an emission pattern where there could be 0 or 1 item or an error signalled by some reactive source.

但我不确定它的真正含义。好像是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习惯了returnObservable<Optional<T>>,是不是味道不好?我应该改为 Observable<Maybe<T>> 吗?

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

如果你的 application/library 只支持 Java >= 8 你可以使用更适合你的。

与您的问题相关的区别在于 Maybe 可以传播错误,而 Optional 不能 - 在您的示例中,无法区分错误和空结果。如果错误处理很重要,Optional 是没用的,而 MaybeMaybe.error(Throwable)。 API-wise,对于您的用例,我更喜欢 Single 而不是 Maybe - 因为它会产生错误或单个结果,所以 return 类型将是 Observable<Single<T>>

Maybeoperation/event 的包装,可能有

  1. 一个结果
  2. 无结果
  3. 错误结果

但是 Optional 是一个 value 的包装器,它可以是

  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(); 
      } 
    }) 
    

Maybe 当你有一个可以发出多个值但你感兴趣的 Observable 时也很有用,比方说,只有第一个,因此你使用 firstElement() Observable 上的运算符。这个 returns a Maybe 因为要么只有一个值,要么没有值(如果源 Observable 在完成之前没有发出任何值)或者有错误(如果源 Observable 在发出任何值之前出错)。

Maybe 是零个或一个事物的惰性流(作为一个流可能会导致错误)。 Optional 不是懒惰,它要么存在要么不存在。 Optional 没有延迟计算的意义,而 Maybe.

有延迟计算的意义