我认为我遇到了一个问题,我做了一个假设:如果一个分裂者的项目没有被一个流消耗,那么分裂者仍然可以前进到它。似乎情况并非如此。
这里有一些代码可以证明:
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());
}
}
输出:
Test 1
spliterator1.estimateSize() = 3
Test 2
spliterator1.estimateSize() = 0
spliterator2.estimateSize() = 6
我知道分裂器可以拆分......但是看起来非拆分,顺序访问会直观地保留非消耗物品。
在test2中,似乎spliterator1在流之后被完全消耗。但是在test1中,它并没有被完全消耗掉。
我能做些什么来达到理想的行为,还是我只是在做一些我不应该做的事情?
答案 0 :(得分: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());
输出:
spliterator1.estimateSize() = 3
spliterator2.estimateSize() = 6
我正在做一些我不该做的事情吗?
简而言之,是的。 Streams库在部分遍历后将在什么状态下留下分裂器没有任何承诺。