为了账号安全,请及时绑定邮箱和手机立即绑定

如何从一个Stream对象执行多次(重用)归约/映射/混合操作

如何从一个Stream对象执行多次(重用)归约/映射/混合操作

繁星点点滴滴 2021-04-28 09:16:44
我知道Java流对象是不允许的forked stream。但是也可以想象一个人会对同一个流执行多个操作。假设我要映射对象列表,但还要总结所有对象的度量。我想知道是否有可能在不将数据转储到列表的情况下做到这一点。Stream<Thing> thingStream = ...;int accumulation = thingStream.mapToInt(Thing::measure).sum();List<Another> results = thingStream.map(t -> toAnother(t)).collect(toList());我知道可以使用,Stream#peek但听起来很黑。
查看完整描述

2 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

只能在一个流上调用一个终端操作(例如:求和,计数,收集..),因此答案是否定的,您不能使用同一流来执行您指定的2个不同的终端操作。

文档的一小部分摘录说:

执行终端操作后,流管道被视为已消耗,无法再使用;如果需要再次遍历相同的数据源,则必须返回到数据源以获取新的流。在几乎所有情况下,终端操作人员都很渴望在返回之前完成对数据源的遍历和对管道的处理。只有终端操作iterator()和spliterator()不在;在现有操作不足以完成任务的情况下,将它们作为“逃生舱口”提供以启用任意客户端控制的管道遍历。


查看完整回答
反对 回复 2021-05-12
?
开满天机

TA贡献1786条经验 获得超13个赞

每个终端操作在源链上调用iterator()。您只能调用一个终端操作,因为Stream不允许对其管道进行多次遍历。这样做会产生IllegalStateException。选择该文件是为了保持一致性,以支持单发流源,例如从网络读取文件或字节。



查看完整回答
反对 回复 2021-05-12
  • 2 回答
  • 0 关注
  • 454 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信