gpt4 book ai didi

java - 为什么 Java 8 Stream 接口(interface)没有 min() 无参数版本?

转载 作者:行者123 更新时间:2023-12-04 01:39:15 25 4
gpt4 key购买 nike

java.util.stream.Stream接口(interface)有两个版本sorted方法——sorted()它按自然顺序对元素进行排序,sorted(Comparator) .为什么min()方法未引入Stream接口(interface),从自然排序的角度来看,哪个会返回最小元素?

最佳答案

应该清楚的是,对于 min , max , 和 sorted , 添加一个方法到 Stream不需要比较器引入了一种失去泛型类型安全性的方法。原因是 Java 语言的当前版本不支持将方法限制为特定参数化的实例,即将它们限制为可比较元素的流。

所以问题可能是反过来的,为什么 sorted() 允许这种类型安全的潜在中断? ?

我无法深入了解开发人员的想法,但有趣的一点是,排序已经被特殊处理了很长时间。随着泛型的引入,可以在没有 Comparator 的情况下强制执行排序。只能对具有可比较元素的集合或数组尝试。然而,特别是在实现泛型集合时,开发人员可能会面临无法使用泛型元素类型创建数组的事实。可能还有其他情况,开发人员遇到形式上不可比较类型的数组或集合,而包含的元素肯定是可比较的。如前所述,我无法深入了解开发人员的想法,说考虑了哪些场景。


  • Arrays.sort(Object[]) 不强制数组类型是 Comparable 的子类型.即使有,
  • sort(T[] a, Comparator<? super T> c) 指定 null比较器意味着“自然顺序”,它允许为任何类型请求自然顺序
  • Collections.sort(List<T> list) 需要类似的元素类型,但
  • Collections.sort(List<T> list, Comparator<? super T> c) 再次指定 null比较器意味着“自然顺序”,因此仍然有一种简单的方法可以破坏类型系统。自“null意味着自然”规则was already specified before Generics existed ,必须保留它以保持兼容性。

  • 但这不仅仅是向后兼容性。 List.sort(Comparator) ,在 Java 8 中引入,也被指定为接受 null作为“自然顺序”的参数,所以现在我们有另一个场景,实现者可能必须在没有保证可比较元素的编译时类型的情况下对数据进行排序。

    因此,在排序方面,已经有很多机会避开类型系统。但是 Stream.sorted(Comparator) 是唯一不接受 null 的排序方法比较器。所以按自然顺序排序而不指定 Comparator.naturalOrder()只能使用 sorted()没有论据。顺便说一句,有一个已经排序的输入 null比较器和请求 sorted()没有比较器是流实现检测到不需要排序的唯一情况,即它不比较比较器并且不检查 Comparator.naturalOrder() .

    一般来说,比较器的类型安全性非常弱。例如。 Collections.reverseOrder() 返回任意类型的比较器,不要求类型可比较。所以而不是 min() , 你可以使用 max(Collections.reverseOrder())请求最小值,无论流的正式类型如何。或使用 Collections.reverseOrder(Collections.reverseOrder())得到等价于 Comparator.naturalOrder()对于任意类型。同样, Collator 实现 Comparator<Object> ,无论出于何种原因,尽管它只能比较 String s。

    关于java - 为什么 Java 8 Stream 接口(interface)没有 min() 无参数版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47849568/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com