你能将一个流分成两个流吗?

196

我有一个用Java 8流表示的数据集:

Stream<T> stream = ...;

我可以看到如何过滤它以获得随机子集 - 例如

Random r = new Random();
PrimitiveIterator.OfInt coin = r.ints(0, 2).iterator();   
Stream<T> heads = stream.filter((x) -> (coin.nextInt() == 0));

我也可以看到如何将这个流减少,例如,得到代表数据集的两个随机一半的列表,然后将它们转换回流。 但是,有没有一种直接从初始流生成两个流的方法?类似于

(heads, tails) = stream.[some kind of split based on filter]

感谢任何见解。


2
Mark的回答比Louis的回答更有帮助,但我必须说Louis的回答更与原始问题相关。问题相当专注于将Stream转换为多个Stream 而不进行中间转换的可能性,尽管我认为达到这个问题的人实际上正在寻找实现此目标的方法,而不考虑这种限制,这是Mark的答案。这可能是因为标题中的问题与描述中的问题不同 - devildelta
11个回答

-3

这样行吗:

Supplier<Stream<Integer>> randomIntsStreamSupplier =
    () -> (new Random()).ints(0, 2).boxed();

Stream<Integer> tails =
    randomIntsStreamSupplier.get().filter(x->x.equals(0));
Stream<Integer> heads =
    randomIntsStreamSupplier.get().filter(x->x.equals(1));

1
由于供应商被调用两次,您将获得两个不同的随机集合。我认为OP的想法是在同一生成的序列中将奇数和偶数分开。 - usr-local-ΕΨΗΕΛΩΝ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接