Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “后的拆分器状态”;“消费”;在流_Java_Java 8_Java Stream - Fatal编程技术网

Java “后的拆分器状态”;“消费”;在流

Java “后的拆分器状态”;“消费”;在流,java,java-8,java-stream,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; /*

我想我遇到了一个问题,我做了一个假设:如果一个拆分器的项目没有被一个流消耗,那么拆分器仍然能够前进到它。看来情况并非如此

下面是一些要演示的代码:

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());
    }
}
我知道拆分器可以拆分。。。但非拆分、顺序访问似乎可以直观地保留未消费的项目

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


我能做些什么来达到想要的行为,还是我只是做了一些我不应该做的事情

这是一个实现细节,但是
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());
输出:

spliterator1.estimateSize() = 3
spliterator2.estimateSize() = 6
我只是在做我不该做的事吗


简言之,是的。Streams library不承诺在部分遍历后,它将在什么状态下离开拆分器。

在流中使用拆分器状态后,弄乱拆分器状态肯定是不应该执行的未定义行为。请参阅
spliterator1.estimateSize() = 3
spliterator2.estimateSize() = 6