rxjava2的Maybe和Optional有什么区别?

时间:2016-11-05 14:51:03

标签: java rx-java optional rx-java2

医生说

  

从概念上讲,它是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>>吗?

4 个答案:

答案 0 :(得分:19)

Maybe操作/事件的包装,可能有

  1. 单一结果
  2. 没有结果
  3. 错误结果
  4. 然而,Optional是围绕的包装器,可以是

    1. 当前
    2. 缺席
    3. 在您的示例中,在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可以发出多个值而你感兴趣的时候,让我们说只有第一个值,因此你使用{{1} Observable上的运算符。这将返回一个Maybe,因为要么存在单个值,要么没有值(如果源Observable在完成之前未发出任何值)或者存在错误(如果在发出任何值之前发生源Observable错误)。

答案 1 :(得分:9)

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

RxJava 2以Java 6为目标。这意味着没有内置Optional支持保证,他们必须自带。与他们如何使用自己的Function类型相似。

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