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

我知道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但听起来很黑。


繁星点点滴滴
浏览 455回答 2
2回答

侃侃无极

您只能在一个流上调用一个终端操作(例如:求和,计数,收集..),因此答案是否定的,您不能使用同一流来执行您指定的2个不同的终端操作。文档的一小部分摘录说:执行终端操作后,流管道被视为已消耗,无法再使用;如果需要再次遍历相同的数据源,则必须返回到数据源以获取新的流。在几乎所有情况下,终端操作人员都很渴望在返回之前完成对数据源的遍历和对管道的处理。只有终端操作iterator()和spliterator()不在;在现有操作不足以完成任务的情况下,将它们作为“逃生舱口”提供以启用任意客户端控制的管道遍历。

开满天机

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

相关分类

Java