我无法迭代(第二次)使用Steam.spliterator创建的流。我找不到与此相关的文档。
下面是我正在做的事情:
我得到了一个Iterable作为函数参数,我像下面的代码一样通过流迭代这个参数:
StreamSupport.stream(values.spliterator(), false)然后我又做了一次,但是第二个根本不迭代。我花了很多时间对其进行调试,最终将iterable转换为开头的列表。
你们有人知道原因吗?
编辑:如果我说得不清楚,很抱歉。
我没有多次使用流,我是以上面的方式使用相同的Iterable生成流的。
Iterable是来自于MapReduce作业中的reduce。
谢谢,Hareendra
发布于 2016-05-06 17:04:21
Stream是一次性对象。只能消费一次,不能多次消费。如果您想多次使用这些内容,您必须像以前一样,将流转换为列表或数组或任何非streamy的内容,然后为您想要做的两件事创建两个新的流。
引用自JavaDoc of Stream类:
一个流只能操作一次(调用中间流或终端流操作)。例如,这排除了“分叉”流,即相同的源提供两个或更多管道,或者同一个流的多个遍历。
发布于 2016-05-10 05:05:52
请确保您用来创建Spliterator的Iterable实例真正遵守Iterable合同。有些人错误地认为任何实现iterator()的东西都将充当Iterable,但事实并非如此。要遵守Iterable约定,用户必须能够多次调用iterator(),并且每次都能够使用它进行迭代。
因为从具有iterator()函数的任何东西中创建Iterable非常容易,所以我已经看到了几个显示您所提到的行为的人工Iterable的例子。例如,可以这样做:
Stream<String> stream = ...
Iterable<String> falseIterable = stream::iterator;falseIterable不遵循所需的Iterable语义,因为falseIterable.iterator()是stream.iterator()的包装器,一旦它被迭代,就不会第二次返回可用的Iterator。
https://stackoverflow.com/questions/37068305
复制相似问题