在foreach循环中,重用静态流方法不能正常工作 递归方法返回foreach循环内cartessian乘积的不适当流输出。Java 8

在foreach循环中,重用静态流方法不能正常工作 递归方法返回foreach循环内cartessian乘积的不适当流输出。Java 8,java,Java,我试图遍历静态方法,递归地重用它,在foreach循环中。方法接受给定流的提供者并返回流,组合为笛卡尔函数。下面给出了两种变体(第2种和第1种) 第二个(所需)代码变体:(预期输出需要修复/建议) 公共类主{ 公共静态流笛卡尔(二进制运算符聚合器、供应商…流){ 返回数组.stream(流) .减少((s1,s2)-> ()->s1.get().flatMap(t1->s2.get().map(t2->aggregator.apply(t1,t2))) .orElse(Stream::empty

我试图遍历静态方法,递归地重用它,在foreach循环中。方法接受给定流的提供者并返回流,组合为笛卡尔函数。下面给出了两种变体(第2种和第1种)

第二个(所需)代码变体:(预期输出需要修复/建议)

公共类主{
公共静态流笛卡尔(二进制运算符聚合器、供应商…流){
返回数组.stream(流)
.减少((s1,s2)->
()->s1.get().flatMap(t1->s2.get().map(t2->aggregator.apply(t1,t2)))
.orElse(Stream::empty).get();
}
公共静态void main(字符串[]args){
列表=新的ArrayList();
增加第(1)款;
增加(2);
增加(3);
流结果=笛卡儿((a,b)->a+b,()->Stream.of(“”),()->Stream.of(“”);
for(整数居里:列表){
结果=笛卡尔(
(a,b)->a+b,
()->笛卡尔(
(a,b)->a+b,
()->IntStream.rangeClosed(1,curI.mapToObj(c->String.valueOf(c)+“,”)
)
);
//result.forEach(System.out::println);//输出也错误
}
result.forEach(System.out::println);
}
}
第二个变量的实际输出:

1,
2,
3,
1, 1, 1
1, 1, 2 
1, 1, 3 
1, 2, 1 
1, 2, 2 
1, 2, 3
第一个变体。使用预期输出,但不灵活满足我的需要代码:

1,
2,
3,
1, 1, 1
1, 1, 2 
1, 1, 3 
1, 2, 1 
1, 2, 2 
1, 2, 3
公共类主{
公共静态流笛卡尔(二进制运算符聚合器、供应商…流){
返回数组.stream(流)
.减少((s1,s2)->
()->s1.get().flatMap(t1->s2.get().map(t2->aggregator.apply(t1,t2)))
.orElse(Stream::empty).get();
公共静态void main(字符串[]args){
流结果=笛卡尔(
(a,b)->a+b,
()->IntStream.rangeClosed(1,1).mapToObj(c->String.valueOf(c)+“,”,
()->IntStream.rangeClosed(1,2).mapToObj(c->String.valueOf(c)+“,”,
()->IntStream.rangeClosed(1,3).mapToObj(c->String.valueOf(c))
);
result.forEach(System.out::println);
}
代码(第一个和第二个)变体的给定输入的预期输出:

1,
2,
3,
1, 1, 1
1, 1, 2 
1, 1, 3 
1, 2, 1 
1, 2, 2 
1, 2, 3

WARINIG!不安全代码!问题:当foreach循环中使用的列表中的元素数达到数百个或更多时,会引发Stackoveflow异常

根据递归的基本概念和在foreach循环内Java中有效地解决最终变量的方法,需要进行轻微的修改

公共类主{
公共静态流笛卡尔(二进制运算符聚合器、供应商…流){
返回数组.stream(流)
.减少((s1,s2)->
()->s1.get().flatMap(t1->s2.get().map(t2->aggregator.apply(t1,t2)))
.orElse(Stream::empty).get();
}
公共静态void main(字符串[]args){
列表=新的ArrayList();
增加第(1)款;
增加(2);
增加(3);
流结果=笛卡儿((a,b)->a+b,()->Stream.of(“”),()->Stream.of(“”);
for(整数居里:列表){
Stream resultInner=结果;
结果=笛卡尔(
(a,b)->a+b,
()->笛卡尔(
(a,b)->a+b,
()->resultInner,
()->IntStream.rangeClosed(1,curI.mapToObj(c->String.valueOf(c)+“,”)
)
);
}
result.forEach(System.out::println);
}
}
但是,每行输出中最后一个逗号有问题:

1, 1, 1, 
1, 1, 2, 
1, 1, 3, 
1, 2, 1, 
1, 2, 2, 
1, 2, 3,

仍在阅读代码,但这最初看起来像是过度使用流