我想知道为什么Java 8不支持在数组上使用流,就像它在集合上一样。你可以写
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 :(得分:6)
In order to add methods to arrays, the language, not the library, needs to be changed. Unlike "regular" objects with members defined in class files, arrays have their members defined directly in the language specification。
这意味着添加myArray.stream()
方法需要更改语言规范,并添加对编译器的支持。这种方法比添加Arrays.stream(myArray)
复杂得多,CREATE OR REPLACE TYPE PersonObj AS OBJECT(
oid integer,
id integer,
name varchar(20),
street varchar(20),
city varchar(10),
state varchar(20),
zipcode varchar(5),
birthDate date,
kidNames set_kids,
picture varchar(100),
place LocationAdt
) NOT FINAL;
/
CREATE OR REPLACE TYPE StudentObj UNDER PersonObj (
studentId varchar(10),
major REF DepartmentObj,
advisor REF ProfessorObj,
hasTaken set_ref_enrolledobj);
/
可以完全在Java类库中实现,而且只需很少的工作量。
答案 1 :(得分:3)
与您的建议非常接近的是discussed,但功能请求被拒绝了:
您所建议的是一种非常小的语言功能,可以为您已经轻松使用库提供一些糖。因此,虽然我们已经考虑过添加将方法注入阵列的机制的可能性,但是以这种方式简单地包装阵列的简易性表明我们可能最好不要在其他地方花费我们的复杂性预算,除非我们可以推导出其他更大的受益于此。
答案 2 :(得分:1)
数组在Java Language Specfication中完全指定。所有Collection
类只是API的一部分。正如您可能想象的那样,对规范的更改比更改API更加昂贵。
您建议的不仅仅是对规范的补充,而且还在语言规范中已知类Stream。虽然这在技术上是可行的(例如参见Class
和Object
),但这并不常见。请注意,即使Collection
类也是语言规范的一部分。