2016-11-05 54 views
4

的醫生說rxjava2的Maybe和Optional有什麼區別?

概念上講,它是單和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>>嗎?

回答

9

Maybe是圍繞操作/事件的包裝可能有兩種

  1. 的單獨結果
  2. 沒有結果
  3. 錯誤結果

然而可選是圍繞一個封裝器,可以是

  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()操作上觀察到。這返回一個Maybe,因爲有一個值,或者沒有值(如果源Observable在完成之前沒有發出任何值)或者有錯誤(如果在發出任何值之前源Observable錯誤)。

+0

不一定是異步事件,可以是同步的。 –

+0

@DaveMoten - 已採取的操作和更改。謝謝。 –

1

rxjava [2]以Java6爲目標。這意味着沒有內建Optional支持保證,他們必須自帶。類似於他們如何帶來他們自己的Function類型。

如果你的應用程序/庫只支持Java> = 8,你可以使用任何適合你的更好的東西。

4

與您的問題相關的差異是Maybe可能傳播錯誤,而Optional不能 - 在您的示例中,無法區分錯誤和空結果。如果錯誤處理很重要,Optional是無用的,而MaybeMaybe.error(Throwable)。 API明智的,爲您的使用情況下,我寧願SingleMaybe - 因爲它產生任何錯誤或單個結果,所以返回類型是Observable<Single<T>>

7

Maybe是零或一個東西的惰性流(並且作爲一個流可能導致錯誤)。 Optional不是懶惰,它可以存在或不存在。用Optional沒有延遲計算的意義,而有Maybe