繁体   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