我研究过在 Java 8 中编写基于流的代码,并注意到一种模式,即我经常有一个列表,但需要通过对每个元素应用简单的映射来将其转换为另一个列表。写完后.stream().map(...).collect(Collections.toList())
还有一次我记得我们有过List.forEach
所以我寻找List.map
但显然这个默认方法还没有被添加。
Why was List.map()
(编辑:或List.transform()
or List.mumble()
)
未添加(这是一个历史问题),并且在默认运行时库中是否有使用其他方法的简单速记方法可以完成我刚刚没有注意到的相同操作?
正如“为什么 java.util.Collection 不实现新的 Stream 接口? https://stackoverflow.com/a/24472635/2711488” 设计决定将Collection
API 和Stream
API被制作成分离的eager and lazy运营。
对此,Collection API 中添加了几个批量操作:
List.replaceAll(UnaryOperator)
List.sort(Comparator)
Map.replaceAll(BiFunction)
Collection.removeIf(Predicate)
Map.forEach(BiConsumer)
Iterable.forEach(Consumer)
所有这些的共同点eager方法是计算结果的函数用于修改底层集合。 Amap
方法返回一个新的Iterable
or Collection
不适合该计划。
此外,在这些方法中,forEach(Consumer)
是唯一一个恰好具有与 a 匹配的签名的签名Stream
方法。不幸的是,这些方法甚至没有做同样的事情;最接近的等价于Iterable.forEach(Consumer)
is Stream.forEachOrdered(Consumer)
。但同样清楚的是,为什么会出现功能重叠。
对每个元素执行其副作用的操作是唯一不修改源集合的批量操作,因此也可以由 Stream API 提供(作为终端操作)。在那里,它将在一个或多个延迟评估的中间操作之后被链接起来;使用它而无需预先执行中间操作是一种特殊情况。
Since map
不是终端操作,它根本不适合 Collection 方法的方案。最接近的等价物是List.replaceAll(UnaryOperator)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)