为什么list.sort不使用Optional API

时间:2015-11-02 21:49:50

标签: java java-8

Java 8在List接口上引入了一种新的默认方法来对其进行排序。它的签名是:

void sort(Comparator<? super E> c)

文档说:

  

如果指定的比较器为null,则表示此列表中的所有元素   必须实现Comparable接口和元素的自然   应该使用订购。

因此,如果您想按照自然顺序对列表进行排序(并且您的元素具有可比性),则必须执行list.sort(null);,这有点奇怪。

如果他们使用了Optional,那么doc会说你可以选择提供一个比较器,如果没有提供,它会认为这些元素已经具有可比性。

list.sort(null);来电将转换为list.sort(Optional.empty());

由于这是一种暴露于外界的方法,我觉得它更准确。

为什么他们没有使用新的Optional API?

2 个答案:

答案 0 :(得分:12)

可选用作返回类型。这一直是JDK-8开发人员的口头禅。因此,他们不会通过将其作为论据来打破自己的规则。

那就是说,我会强制论证,因此迫使开发人员使用

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

即使我可以传递null,我发现上面的内容更具可读性,而且更加冗长。这就是我在代码中使用的内容。

答案 1 :(得分:1)

默认方法是委派Arrays#sorthas existed since at least 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检查就足够了的开销远大于它的好处,特别是考虑到没有语义差异。