簡體   English   中英

關於可選 class 設計的問題

[英]Questions about the design of the Optional class

我一直在試圖弄清楚為什么對 java.util.Optional 的設計做出了一些決定。 我遇到的問題是:

  1. 我覺得 java 將 Optional 實例包裝在額外的 Optional 中是不雅的。 我希望干凈的 api 能夠自動處理 optional 類型的值,而無需再次裝箱。即, Optional.of(Optional.of("name")) 理想情況下將具有 Optional<String> 類型而不是 Optional<Optional<String> >。

  2. flatMap 覺得沒必要……為什么不提供另一個重載的 map?

     public <U> Optional<U> map(Function<? super T, ? extends Optional<? extends U>> mapper) { //... same implementation as flatMap }

因此,您無需擔心在 flatMap 和常規 map 之間進行選擇,會根據您的映射器自動選擇合適的。

  1. 如果 Optional 的全部目的是簡化您的代碼,那么如果沒有值存在,為什么 get() 會拋出異常?...這比簡單地返回 null 更干凈。 尤其是因為我們也有 orElseThrow() 做同樣的事情。

PS - 我的假設是,沒有充分的理由將一個值裝在一個以上的 Optional 層中,所以如果在某些情況下這是有意義的,我很想知道。

有人對此有見解嗎? 謝謝

  1. 我覺得 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);

  1. flatMap 覺得沒必要……為什么不提供另一個重載的 map?
 public <U> Optional<U> map(Function<? super T, ? extends Optional<? extends U>> mapper) { //... same implementation as flatMap }

討論方法的名稱時,您的建議沒有意義,原因如下:

  1. 如果重載map方法,這兩種方法將具有相同的形式參數並會發生沖突。

    'map(Function<? super T, ? extends Optional<? extends U>>)' 與 'map(Function<? super T, ? extends U>)' 沖突; 兩種方法都有相同的擦除

  2. flat map 這個詞暗示整個結構是扁平的。 該方法還對應於Stream#flatMap(Function<T, Stream<R>>) Optional視為 0..1 項的 stream 和Stream視為 0..n 項的 stream。

    看? 上面我已經在代碼中演示了flatMap方法的含義,然后進行解釋。 這很方便!


  1. 如果 Optional 的全部目的是簡化您的代碼,那么如果沒有值存在,為什么 get() 會拋出異常?...這比簡單地返回 null 更干凈。 尤其是因為我們也有 orElseThrow() 做同樣的事情。

看看這個答案,讓我從中強調以下內容:

請參閱此討論 這允許調用者繼續一系列流暢的方法調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM