在Stream中"消耗"后的Spliterator状态

dsm*_*ith 6 java java-8 java-stream

我认为我遇到了一个问题,我做了一个假设:如果一个分裂者的项目没有被一个流消耗,分裂者仍然可以前进到它.看来情况并非如此.

这里有一些代码来演示:

import java.util.Spliterator;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

/**
 * Created by dsmith on 7/21/15.
 */
public class SpliteratorTest {
    public static void main(String[] args) {
        System.out.println("Test 1");
        test1();

        System.out.println("Test 2");
        test2();
    }

    public static void test1() {
        final Spliterator<String> spliterator1 = Stream.of("a", "b", "c", "d", "e", "f").spliterator();

        StreamSupport.stream(spliterator1, false).
                limit(3).
                collect(Collectors.toList());

        System.out.println("spliterator1.estimateSize() = " + spliterator1.estimateSize());
    }

    public static void test2() {
        final Spliterator<String> spliterator1 = Stream.of("a", "b", "c", "d", "e", "f").spliterator();
        final Spliterator<String> spliterator2 = Stream.of("1", "2", "3", "4", "5", "6").spliterator();

        Stream.of(StreamSupport.stream(spliterator1, false), StreamSupport.stream(spliterator2, false)).
                flatMap(Function.identity()).
                limit(3).
                collect(Collectors.toList());

        System.out.println("spliterator1.estimateSize() = " + spliterator1.estimateSize());
        System.out.println("spliterator2.estimateSize() = " + spliterator2.estimateSize());
    }
}
Run Code Online (Sandbox Code Playgroud)

这输出:

Test 1
spliterator1.estimateSize() = 3
Test 2
spliterator1.estimateSize() = 0
spliterator2.estimateSize() = 6
Run Code Online (Sandbox Code Playgroud)

我知道分裂器可以拆分......但似乎非拆分,顺序访问会直观地保留非消耗的物品.

在test2中,似乎spliterator1在流之后被完全消耗.但是在test1中,它没有被完全消耗掉.

我能做些什么来获得理想的行为,还是我只是在做一些我不该做的事情?

Mis*_*sha 5

这是一个实现细节,但flatMap目前的工作方式是它不会拆分成其内容或一次迭代一个元素.它一气呵成地吞噬它.如果你Stream.concat(...)不是flatMap,你应该看到其中的差别:

Stream.concat(StreamSupport.stream(spliterator1, false), StreamSupport.stream(spliterator2, false)).
        limit(3).
        collect(Collectors.toList());

System.out.println("spliterator1.estimateSize() = " + spliterator1.estimateSize());
System.out.println("spliterator2.estimateSize() = " + spliterator2.estimateSize());
Run Code Online (Sandbox Code Playgroud)

输出:

spliterator1.estimateSize() = 3
spliterator2.estimateSize() = 6
Run Code Online (Sandbox Code Playgroud)

我只是在做一些我不该做的事情?

简而言之,是的.Streams库没有做出任何承诺,它会在部分遍历后留下分裂器.