簡體   English   中英

為什么list.sort不使用Optional API

[英]Why list.sort does not use the Optional API

Java 8在List接口上引入了一個新的默認方法來對其進行排序。 它的簽名是:

void sort(Comparator<? super E> c)

文件說:

如果指定的比較器為null,則此列表中的所有元素都必須實現Comparable接口,並且應使用元素的自然順序。

因此,如果您想按照它的自然順序對列表進行排序(並且您的元素具有可比性),則必須執行list.sort(null); 這有點奇怪我的意見。

如果他們使用了Optional那么doc會說你可以選擇提供一個比較器,如果沒有提供,它會認為這些元素已經具有可比性。

list.sort(null); call將被轉換為list.sort(Optional.empty());

因為它是一種暴露於外部世界的方法,我會發現它更准確。

他們為什么不使用新的Optional API呢?

可選用作返回類型。 這一直是JDK-8開發人員的口頭禪。 因此,他們不會通過使用它作為論據來打破自己的規則。

也就是說,我會強制論證,從而迫使開發人員使用

list.sort(Comparator.<Foo>naturalOrder());

即使我可以傳遞null,我發現上面的內容更具可讀性,而且更加冗長。 這就是我在代碼中使用的內容。

默認方法是委托給Arrays#sort ,它至少從 Java 1.7開始存在

這是默認方法的相關代碼段:

@SuppressWarnings({"unchecked", "rawtypes"})
default void sort(Comparator<? super E> c) {
    Object[] a = this.toArray();
    Arrays.sort(a, (Comparator) c);
    ListIterator<E> i = this.listIterator();
    for (Object e : a) {
        i.next();
        i.set((E) e);
    }
}

觀察它正在將列表轉換為數組並讓Arrays#sort從那里處理它。 然后,此默認行為將回退到該方法支持的行為。

有兩個原因讓我覺得這比添加一個Optional更可取:

  • 如果你沒有一個Comparator使用,或只是想“默認”的行為,你可以提供一個null吧。 在此上下文中, nullOptional.isPresent()用於相同的目的,不會獲得任何可用性點。

    必須為函數的默認行為提供 null是一件煩惱; 更好的設計可能是重載方法或允許傳入默認的naturalOrder實例。

  • Optional模式更傾向於防止無意中處理null引用,而不是用於null檢查。 添加Optional的開銷在一個簡單的null檢查就足夠了將遠遠超過它的好處,特別是考慮到沒有語義差異。

暫無
暫無

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

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