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?
答案 0 :(得分:12)
可选用作返回类型。这一直是JDK-8开发人员的口头禅。因此,他们不会通过将其作为论据来打破自己的规则。
那就是说,我会强制论证,因此迫使开发人员使用
list.sort(Comparator.<Foo>naturalOrder());
即使我可以传递null,我发现上面的内容更具可读性,而且更加冗长。这就是我在代码中使用的内容。
答案 1 :(得分:1)
默认方法是委派Arrays#sort
,has 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
。在这种情况下,null
和Optional.isPresent()
用于同一目的,不会获得任何可用性点。
为函数默认行为提供 null
是一件烦恼。更好的设计可能是重载方法或允许传入默认的naturalOrder
实例。
Optional
模式更倾向于防止无意中处理null
引用,而不是用于null
检查。添加Optional
进行简单null
检查就足够了的开销远大于它的好处,特别是考虑到没有语义差异。