2016-11-07 130 views
0

我正在使用Stream與findFirst(),它返回可選項,但有一個機會,我的流可能不會發射任何東西,所以我在底部運行orElse運算符。FindFirst和orElse運算符返回不同的類類型

問題是,orElse不會返回可選的類,而是可選的findFirst操作符包裝的類類型。

 def optional = categories.categories.stream() 
       .filter { category -> category.name == selCategory } 
       .map { category -> loadUniqueIds.call(category) } 
       .map { UUIDs -> new JsonArray(UUIDs) } 
       .findFirst().orElse{Optional.of(new JsonArray())} 
     optional.get() 

所以我最終沒有使用findFirst和orElse的可能性。

我在這裏做錯了什麼?

感謝

UPDATE:

我結束了在使用FindFirst後除去否則容易和檢查可選後來

 optional.isPresent() ? optional.get(): new JsonArray() 

無論如何,如果有人有更好的/優雅的解決方案,請讓我知道。

問候。

+1

什麼是'def optional'應該在Java中? – khelwood

+0

這是groovy,但我使用Java 8流 – paul

回答

4

如果使用findFirst()你得到一個Optional,但如果你使用orElse()(這是Optional的方法),你得到的未包裝的對象,因爲沒有辦法,你可以得到一個Optional了。要麼你得到findFirst()解開的中發現的東西,你會從orElse()獲得「默認」值。

orElse()返回可選項沒有任何意義,因爲它始終保證存在。

Optional.of("foo").orElse("bar"); // Returns String "foo" 
Optional.empty().orElse("bar"); // Returns String "bar" 
+0

謝謝,這就是我雖然 – paul

+0

可能最好使用'orElseGet { - >新的JsonArray()}'在這種情況下,所以你不做一個新的每次它被稱爲不管什麼 –