我正在尝试将以下循环转换为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
IntStream.range(0, left.length)
.mapToObj(x -> left[x] + " " + right[x % right.length])
.forEachOrdered(System.out::println);
其中
left
是 a
且 right
是 b
撇开命令式解决方案的索引细节不谈,这个问题可以看作是迭代两个列表的连续元素,根据需要重复第二个列表。
第三方 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
的相同数量的元素(重复)。