[英]Questions about the design of the Optional class
我一直在試圖弄清楚為什么對 java.util.Optional 的設計做出了一些決定。 我遇到的問題是:
我覺得 java 將 Optional 實例包裝在額外的 Optional 中是不雅的。 我希望干凈的 api 能夠自動處理 optional 類型的值,而無需再次裝箱。即, Optional.of(Optional.of("name")) 理想情況下將具有 Optional<String> 類型而不是 Optional<Optional<String> >。
flatMap 覺得沒必要……為什么不提供另一個重載的 map?
public <U> Optional<U> map(Function<? super T, ? extends Optional<? extends U>> mapper) { //... same implementation as flatMap }
因此,您無需擔心在 flatMap 和常規 map 之間進行選擇,會根據您的映射器自動選擇合適的。
PS - 我的假設是,沒有充分的理由將一個值裝在一個以上的 Optional 層中,所以如果在某些情況下這是有意義的,我很想知道。
有人對此有見解嗎? 謝謝
- 我覺得 java 將 Optional 實例包裝在額外的 Optional 中是不雅的。 我希望干凈的 api 能夠自動處理可選類型的值而無需再次裝箱。即,Optional.of(Optional.of("name")) 理想情況下將具有可選類型而不是 Optional<Optional>。
如果你把一個蘋果放在一個盒子里,然后把盒子放進另一個盒子里,認為盒子合並成一個是愚蠢的。 與Optional
包裝器相同。 將List
放入List
也會導致List<List<?>>
。
不過,什么是有意義的, flatmap
提供的是在達到雙重包裝后對結構進行平面映射。 例如:
Optional.of(Optional.of("apple"))
.flatMap(opt -> opt) // also Function.identity() is possible
.ifPresent(System.out::println);
- flatMap 覺得沒必要……為什么不提供另一個重載的 map?
public <U> Optional<U> map(Function<? super T, ? extends Optional<? extends U>> mapper) { //... same implementation as flatMap }
討論方法的名稱時,您的建議沒有意義,原因如下:
如果重載map
方法,這兩種方法將具有相同的形式參數並會發生沖突。
'map(Function<? super T, ? extends Optional<? extends U>>)' 與 'map(Function<? super T, ? extends U>)' 沖突; 兩種方法都有相同的擦除
flat map 這個詞暗示整個結構是扁平的。 該方法還對應於Stream#flatMap(Function<T, Stream<R>>)
。 將Optional
視為 0..1 項的 stream 和Stream
視為 0..n 項的 stream。
看? 上面我已經在代碼中演示了flatMap
方法的含義,然后進行解釋。 這很方便!
- 如果 Optional 的全部目的是簡化您的代碼,那么如果沒有值存在,為什么 get() 會拋出異常?...這比簡單地返回 null 更干凈。 尤其是因為我們也有 orElseThrow() 做同樣的事情。
看看這個答案,讓我從中強調以下內容:
請參閱此討論。 這允許調用者繼續一系列流暢的方法調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.