将并行增量嵌套循环转换为流

问题描述 投票:0回答:2

我正在尝试将以下 Groovy for 循环转换为 Java 流。

def a = [12,34,5,64,24,56], b = [1,23,45]

for(int i=0;i<a.size();)
  for(int j=0;j<b.size() && a[i];j++)
    println a[i++]+","+b[j]

输出:

12,1
34,23
5,45
64,1
24,23
56,45

我尝试了几种方法,但我不确定如何从内循环增加外循环。任何指导表示赞赏。以下代码是我做过的最远的代码。

a.stream().forEach({x ->
    b.stream().filter({y-> y%2 != 0}).forEach({ y-> 
        println x+","+y
    });
});

输出:

12,1
12,23
12,45
34,1
34,23
34,45
5,1
5,23
5,45
64,1
64,23
64,45
24,1
24,23
24,45
56,1
56,23
56,45
groovy stream java-stream iteration
2个回答
0
投票
IntStream.range(0, left.length)
         .mapToObj(x -> left[x] + " " + right[x % right.length])
         .forEachOrdered(System.out::println);

其中

left
a
right
b


0
投票

撇开命令式解决方案的索引细节不谈,这个问题可以看作是迭代两个列表的连续元素,根据需要重复第二个列表。

第三方 Google Guava 库提供了

Streams.forEachPair
方法来迭代两个流的连续元素。

Streams.forEachPair(
        a.stream(), 
        Stream.generate(b::stream).flatMap(s -> s),
        (a1, a2) -> System.out.println(a1 + "," + a2));

Stream.generate(b::stream).flatMap(Function.identity())
调用会重复生成
b
元素的无限流。 当较短的流耗尽时,
Streams.forEachPair
停止,因此它将迭代
a
的所有元素,以及来自
b
的相同数量的元素(重复)。

© www.soinside.com 2019 - 2024. All rights reserved.