2017-01-02 125 views
3

我想知道为什么Java 8不包含对数组使用流的支持,就像它在集合上使用流一样。你可以写为什么Java 8没有“myArray.stream()”函数?

Collection<String> myCollection = new ArrayList<String>(); 
    Stream<String> stream = myCollection.stream(); 

,但你不能写:

String[] myArray = new String[] {}; 
    Stream<String> stream = myArray.stream(); 

我知道的实用方法Arrays.stream的,所以这是可以用来代替:

Stream<String> stream = Arrays.stream(myArray); 

但它给我留下想知道为什么这种笨拙的静态实用方法调用在lambda表达式允许简单编码这么多的上下文中是必需的。我意识到Collection(基于对象/接口的)世界与array更“本土”世界之间的显着差异。

谁能详细说明这一点?

+0

有人会比我回答得更好,但是数组是Java中特殊的对象,这不是来自像'Collection'这样的特定类/接口。你没有'Array '而是'String []',这是特定于数组的 – AxelH

+2

为什么'stream'特别是? “Collection”接口中的其他方法呢? –

回答

1

该阵列完全在Java Language Specfication中指定。所有Collection类只是API的一部分。正如你可能想象的那样,对规范的修改比对API的修改更昂贵。

你的建议不仅仅意味着对规范的补充,而且类流在语言规范中是已知的。尽管这在技术上是可行的(例如参见ClassObject),但这不是很常见。请注意,即使Collection类也是语言规范的一部分。

3

东西非常接近,你的建议是discussed但功能要求遭到拒绝:

什么你的建议是一个不小的语言功能,以提供糖的一个小一点的东西你已经可以轻易做到与图书馆。所以,虽然我们已经考虑过添加一种将方法注入数组的机制,但仅仅以这种方式包装数组的方便性意味着我们可能更好地将复杂性预算花费在其他地方,除非我们可以从其他方面获得其他更大的好处这个。

+0

感谢您的链接!在那次讨论中,我还发现这个提示非常有用:'主要的问题是目前在数组类型上没有'真正'的方法,所以通常虚拟机有一种特殊的方式来表示它们,你提出的建议确实需要从VM的观点。' – SebastianH

+0

关于第二个想法和进一步的研究,这个报价实际上是错误的!无需更改虚拟机。它可以由编译器处理。如果我没有弄错,Java 8已经将'::'方法作为参数语言扩展使用。 – SebastianH

6

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

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