0

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

这是我正在做的事情:

我得到了一个Iterableas funciton 参数,我正在通过流迭代它,如下面的代码:

StreamSupport.stream(values.spliterator(), false)

然后我又做了一次,但第二个根本不迭代。我花了很多时间调试它,最后在开始时将可迭代对象转换为列表。

有小伙伴知道原因吗?

编辑:对不起,如果我不清楚,

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

Iterable 是 MapReduce 作业中来自 reduce 的。

谢谢,哈伦德拉

4

2 回答 2

0

确保Iterable您用于创建您的实例Spliterator真正遵守Iterable合同。有些人错误地认为任何实现的东西iterator()都可以用作Iterable,但事实并非如此。为了遵守Iterable合同,必须能够iterator()多次调用并且每次都能够对其进行迭代。

因为很容易Iterable从任何具有iterator()功能的东西中创建一个,所以我已经看到了几个Iterable表现出你提到的行为的制造案例。例如,可以这样做:

Stream<String> stream = ...
Iterable<String> falseIterable = stream::iterator;

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

于 2016-05-09T21:05:51.990 回答
0

AStream是一次性对象。您只能食用一次,不能多次食用。如果你想多次使用这些内容,你必须像以前一样将流转换为列表或数组或任何非流式的,然后从中创建两个新的流来完成你想做的两件事。

引用类的JavaDocStream

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

于 2016-05-06T09:04:20.713 回答