相关疑难解决方法(0)

为什么java.util.Collection没有实现新的Stream接口?

我花了一些时间开始研究关于流和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 lambda functional-programming java-8 java-stream

47
推荐指数
1
解决办法
3445
查看次数

为什么Java List接口不支持getLast()?

我正在尝试理解Java标准集合库中的API不一致性.

List或AbstractList中没有方法可以获取最后一项,尽管可以使用size和getIndex()来模拟它.

但是,LinkedList支持该功能.

知道为什么决定不在界面中支持这种方法吗?

java api collections

18
推荐指数
2
解决办法
6700
查看次数

为什么Java集合不提供方便的映射方法?

我想知道为什么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方法?也许是因为它不够灵活,因为你需要决定一个返回类型?

我确信实现者已经考虑过它,并且有理由不把它放进去.我想了解原因.

java collections java-stream

5
推荐指数
1
解决办法
88
查看次数