首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法迭代使用Steam.spliterator在Iterable上创建(第二次)的流

无法迭代使用Steam.spliterator在Iterable上创建(第二次)的流
EN

Stack Overflow用户
提问于 2016-05-06 17:01:27
回答 2查看 307关注 0票数 0

我无法迭代(第二次)使用Steam.spliterator创建的流。我找不到与此相关的文档。

下面是我正在做的事情:

我得到了一个Iterable作为函数参数,我像下面的代码一样通过流迭代这个参数:

代码语言:javascript
复制
StreamSupport.stream(values.spliterator(), false)

然后我又做了一次,但是第二个根本不迭代。我花了很多时间对其进行调试,最终将iterable转换为开头的列表。

你们有人知道原因吗?

编辑:如果我说得不清楚,很抱歉。

我没有多次使用流,我是以上面的方式使用相同的Iterable生成流的。

Iterable是来自于MapReduce作业中的reduce。

谢谢,Hareendra

EN

回答 2

Stack Overflow用户

发布于 2016-05-06 17:04:21

Stream是一次性对象。只能消费一次,不能多次消费。如果您想多次使用这些内容,您必须像以前一样,将流转换为列表或数组或任何非streamy的内容,然后为您想要做的两件事创建两个新的流。

引用自JavaDoc of Stream类:

一个流只能操作一次(调用中间流或终端流操作)。例如,这排除了“分叉”流,即相同的源提供两个或更多管道,或者同一个流的多个遍历。

票数 0
EN

Stack Overflow用户

发布于 2016-05-10 05:05:52

请确保您用来创建SpliteratorIterable实例真正遵守Iterable合同。有些人错误地认为任何实现iterator()的东西都将充当Iterable,但事实并非如此。要遵守Iterable约定,用户必须能够多次调用iterator(),并且每次都能够使用它进行迭代。

因为从具有iterator()函数的任何东西中创建Iterable非常容易,所以我已经看到了几个显示您所提到的行为的人工Iterable的例子。例如,可以这样做:

代码语言:javascript
复制
Stream<String> stream = ...
Iterable<String> falseIterable = stream::iterator;

falseIterable不遵循所需的Iterable语义,因为falseIterable.iterator()stream.iterator()的包装器,一旦它被迭代,就不会第二次返回可用的Iterator

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37068305

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档