![](/img/trans.png)
[英]Does Java stream().sorted or list.sort() not increases time complexity?
[英]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
吧。 在此上下文中, null
和Optional.isPresent()
用于相同的目的,不会获得任何可用性点。
必须为函数的默认行为提供 null
是一件烦恼; 更好的设计可能是重载方法或允许传入默认的naturalOrder
实例。
Optional
模式更倾向于防止无意中处理null
引用,而不是用于null
检查。 添加Optional
的开销在一个简单的null
检查就足够了将远远超过它的好处,特别是考虑到没有语义差异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.