将 Java8 流数组转换为元组流

zak*_*mck 5 java-8 java-stream

假设我有一个 Java 8 流数组:Stream<T>[] streams,我想创建一个 Stream,其中新流的每个元素都是一个数组,由从每个初始基本流中选取一个元素组成(假设它们都是连续的) )。

例如,如果我有:

  streams [ 0 ] returning: ( "A", "B", "C" ), 
  streams [ 1 ] returning ( "X", "Y", "Z" ) 
  and streams [ 2 ] as ( "0", "1", "2" )
Run Code Online (Sandbox Code Playgroud)

我想要一个返回的流

  ( { "A", "X", "0" }, { "B", "Y", "1" }, { "C", "Z", "2" } )
Run Code Online (Sandbox Code Playgroud)

是否有一些代码已经实现了这一点?我有一个如何去做的想法,这将是对 case的概括,但我想知道是否已经存在可重用的东西。

编辑:对不起,我意识到我需要澄清一下:

  • 我不想创建整个矩阵,我想要一个每次动态返回一行的流(首先是 A/X/0,然后是 B/Y/1 等),而不必占用所有行的内存提前。我对基本流的大小做出合理的假设很好(例如,取最小值,一旦有没有更多元素要返回的流就停止)。

  • 我知道这可以通过首先将基本流转换为迭代器,然后创建一个新的迭代器来实现,其中 next() 从每个下划线迭代器中选择一个元素并返回一个新行。这就是我上面链接的配对示例所做的,我可以自己实现它,在这里我试图了解它是否已经在某个库中完成(我知道 JDK 没有这样的功能)。

zak*_*mck 1

好吧,好像没有这样的东西,所以我自己写了:

  • TupleSpliterator,从分裂器数组开始构建元组分裂器;
  • Tuple Stream Builder,它从流数组开始并利用元组迭代器构建元组流。
  • 基于 Spliteraror/Iterator 允许并行性(在某些条件下),如果您想要更简单但顺序的东西,也可以使用TupleIterator 。

单元测试中提供了使用示例(此处此处),这些类是此实用程序包的一部分。

编辑:在 Federico 发表评论后,我添加了 Spliterator 实现,注意到Iterator基于 - 的版本不能并行。