我花了一些时间开始研究关于流和lambdas的java-8嗡嗡声.让我吃惊的是,你不能应用流操作,例如.map(),.filter()直接上java.util.Collection.是否存在技术原因导致java.util.Collection接口未通过这些Stream操作的默认实现进行扩展?
谷歌搜索了一下,我看到很多人按照以下模式编码的例子:
List<String> list = someListExpression;
List<String> anotherList = list.stream().map(x -> f(x)).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
如果你的代码中有很多这些流操作,那就变得非常笨拙了.由于.stream()并且.collect()与您想表达的内容完全无关,您宁愿说:
List<String> list = someListExpression;
List<String> anotherList = list.map(x -> f(x));
Run Code Online (Sandbox Code Playgroud) 我正在尝试理解Java标准集合库中的API不一致性.
List或AbstractList中没有方法可以获取最后一项,尽管可以使用size和getIndex()来模拟它.
但是,LinkedList支持该功能.
知道为什么决定不在界面中支持这种方法吗?
我想知道为什么Java Collections API不包含map不同集合类型的方便方法.我想写一些类似的东西:
List<Foo> list = ...;
List<String> result = list.map(Foo::toString);
Run Code Online (Sandbox Code Playgroud)
相反,我必须创建一个流,地图和收集,如下所示:
List<Foo> list = ...;
List<String> result = list.stream().map(Foo::toString).collect(toList());
Run Code Online (Sandbox Code Playgroud)
难道不像在java.util.List接口中实现这个默认方法那么容易吗?例如
default <R> List<R> map(Function<E, R> mapper){
return stream().map(mapper).collect(Collectors.toList());
}
Run Code Online (Sandbox Code Playgroud)
乍一看,似乎有其他方便的方法.例如:
list.stream().forEach(x -> {});
Run Code Online (Sandbox Code Playgroud)
可写成
list.forEach(x -> {});
Run Code Online (Sandbox Code Playgroud)
但是,比较并不是那么好.Iteratable.forEach是顶级接口上的默认方法,不需要指定返回类型.它不是在引擎盖下创建一个流,而是使用Iteratables属性来......好......迭代所有元素.
所以问题仍然存在:为什么不在每个Collections API接口上都有map方法?也许是因为它不够灵活,因为你需要决定一个返回类型?
我确信实现者已经考虑过它,并且有理由不把它放进去.我想了解原因.