为什么Java 8没有;myArray.stream();功能?

为什么Java 8没有;myArray.stream();功能?,java,arrays,lambda,Java,Arrays,Lambda,我想知道为什么Java8不支持像在集合上一样在数组上使用流。你可以写 Collection<String> myCollection = new ArrayList<String>(); Stream<String> stream = myCollection.stream(); 但这让我想知道,在lambda表达式允许编写这么多代码的上下文中,为什么需要这种笨拙的静态实用程序方法调用。我意识到集合的(基于对象/接口的)世界与数组的更为“原生

我想知道为什么Java8不支持像在集合上一样在数组上使用流。你可以写

    Collection<String> myCollection = new ArrayList<String>();
    Stream<String> stream = myCollection.stream();
但这让我想知道,在lambda表达式允许编写这么多代码的上下文中,为什么需要这种笨拙的静态实用程序方法调用。我意识到
集合的(基于对象/接口的)世界与
数组的更为“原生”的世界之间的显著差异


谁能详细说明这一点?

与您的建议非常接近,但功能请求被拒绝:

您所建议的是一个不小的语言特性,它可以为您已经可以轻松使用这些库所做的事情提供一点支持。因此,虽然我们已经考虑了向数组中添加方法注入机制的可能性,但以这种方式包装数组的简单性表明,我们最好将复杂性预算花在其他地方,除非我们可以从中获得其他更大的好处


为了向数组添加方法,需要更改语言,而不是库。与在类文件中定义成员的“常规”对象不同,数组定义了其成员


这意味着添加
myArray.stream()
方法需要更改语言规范,并向编译器添加支持。这种方法比添加
Arrays.stream(myArray)
复杂得多,后者可以完全在Java类库中实现,只需很少的努力。

数组完全在中指定。其中,所有
集合
类都只是API的一部分。正如您可能想象的那样,对规范的更改比对API的更改更昂贵


您的建议不仅意味着对规范的添加,还意味着类流在语言规范中是已知的。虽然这在技术上是可能的(例如参见
对象
),但这并不常见。请注意,即使是
集合
类也是语言规范的一部分。

有人会比我回答得更好,但数组在Java中是特殊的对象,它不是来自像
集合
这样的特定类/接口。您没有
数组
,但有
字符串[]
,这是特定于数组的,特别是为什么
?那么
集合
界面中的其他方法呢?谢谢你的链接!在那次讨论中,我还发现这个提示非常有用:
主要的问题是,目前在数组类型上没有“真正”的方法,所以通常VM有一种特殊的方式来表示它们,您提出的建议确实需要从VM的角度进行大的更改。
经过深思熟虑和进一步研究,这句话实际上是错误的!无需更改虚拟机。它可以由编译器处理。如果我没有弄错的话,Java8已经将其用于
方法作为参数语言扩展。
    String[] myArray = new String[] {};
    Stream<String> stream = myArray.stream();
    Stream<String> stream = Arrays.stream(myArray);