【发布时间】:2015-09-18 02:14:09
【问题描述】:
我将流分离器直接用于我正在编写的库中的低级操作。最近,当我使用流拆分器并交错 tryAdvance/trySplit 调用时,我发现了非常奇怪的行为。这是一个演示问题的简单代码:
import java.util.Arrays;
import java.util.Spliterator;
public class SpliteratorBug {
public static void main(String[] args) {
Integer[][] input = { { 1 }, { 2, 3 }, { 4, 5, 6 }, { 7, 8 }, { 9 } };
Spliterator<Integer> spliterator = Arrays.stream(input).parallel()
.flatMap(Arrays::stream).spliterator();
spliterator.trySplit();
spliterator.tryAdvance(s -> {});
spliterator.trySplit();
spliterator.forEachRemaining(System.out::println);
}
}
输出是
5
6
9
如您所见,在平面映射之后,我应该得到从1 到9 的连续数字的有序流。我拆分了一次拆分器,所以它应该跳转到某个中间位置。接下来,我从中消耗一个元素并再次拆分它。之后我打印所有剩余的元素。我希望我会从流尾部获得几个连续的元素(可能是零个元素,也可以)。然而我得到的是5和6,然后突然跳转到9。
我知道目前在 JDK 中没有以这种方式使用拆分器:它们总是在遍历之前拆分。不过官方documentation并没有明确禁止在tryAdvance之后调用trySplit。
当我使用直接从集合、数组、生成的源等创建的拆分器时,从未观察到此问题。仅当拆分器是从具有中间 flatMap 的并行流创建时才观察到的。
所以问题是:我是否遇到了错误,或者在某处明确禁止以这种方式使用拆分器?
【问题讨论】:
标签: java java-8 java-stream spliterator