rxjava2的Maybe和Optedstin有什么区别?

2022-09-04 23:57:48

文档说

从概念上讲,它是单一和可兼容的并集,提供了捕获发射模式的方法,其中可能存在0或1个项目或由某些无功源发出的错误信号。

但我不确定它到底意味着什么。看来是java8的.Optional

以下两个代码具有相同的结果,但我不知道可以做什么和不能做什么(或繁琐)。MaybeOptional

  @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>>


答案 1

Maybe是操作/事件的包装器,该操作/事件可能具有以下

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

但是,Optional 是一个值的包装器,该可以是

  1. 目前
  2. 缺席

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

但是,还有其他选择:

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

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

Maybe当您有一个可以发出多个值但您对第一个值感兴趣,因此您在可观察量上使用运算符时,它也很有用。这将返回“可能”,因为存在单个值,或者没有值(如果源 Observable 在完成之前未发出任何值)或存在错误(如果源可观察性在发出任何值之前出现错误)。ObservablefirstElement()


答案 2

Maybe是零个或一个事物的懒惰流(并且作为流可能会导致错误)。 不是懒惰,它要么存在,要么不存在。没有延迟计算的感觉与 a 而有 。OptionalOptionalMaybe


推荐