Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 连接其中的流';s自己的forEach循环_Java_Foreach_Java Stream - Fatal编程技术网

Java 连接其中的流';s自己的forEach循环

Java 连接其中的流';s自己的forEach循环,java,foreach,java-stream,Java,Foreach,Java Stream,例1: public TailCall<TestClass> useOfStream(Stream<Test> streamL) { ArrayList<Test> testList2 = new ArrayList<>(); Stream<Test> streamL2 = testList2.stream(); streamL.forEach(test -> {

例1:

 public TailCall<TestClass> useOfStream(Stream<Test> streamL) {
        ArrayList<Test> testList2 = new ArrayList<>();
        Stream<Test> streamL2 = testList2.stream();

        streamL.forEach(test -> {
            for (int i = 1; i < 14; i++) {
                if (/*insert if statement*/) {
                    Test test2 = new Test();
                    Stream<Test> streamT = stream.of(test2);
                    **streamL2.concat(streamL2, streamT);**
                } else {
                    //do something with TestClass
                }
            }
        });
        if (streamL2.findAny().isPresent()) {
            return call(() -> useOfStream(streamL2));
        } else {
            return TailCalls.done(TestClass);
        }
    }
如果甚至可以为每个循环在它自己的流中连接一个流,那么forEach循环是否也会通过这些新添加的元素?这将消除我对递归方法的需求。
另一个问题是,在流中生成的对象(例如streamL的forEach循环中的
testtest2=newtest();
)是否会被程序延迟处理?换句话说,这个对象会出现在内存堆中吗?(但这个问题并不重要,主要是我的第一个问题)

您可以用
flatMap
替换第一个
forEach
,并使用
Stream.builder()
创建一个子流,其中包含附加元素和重用的
t
元素:

流式(“A1”、“A2”).flatMap(t->{
Stream.Builder subStream=Stream.Builder();
子流添加(t);
对于(int i=1;i<3;i++){
子流添加(“B”+i);
}
返回subStream.build();
}).forEach(系统输出::打印);
印刷品

A1B1B2A2B1B2

我不确定我是否真的理解您的要求,但我建议您查看
Stream.flatMap(…)
。第二块代码可以执行吗?这就是我要问的。。。如果是,这是否意味着streamL的初始forEach循环一直持续到调用forEach循环时原始streamL的末尾,或者如果它一直持续到流的真正末尾(也循环了新添加的元素)。我看不到“第二个”之间有什么区别代码块和第一个代码块的中心部分。正如我所说,我不确定我是否理解您的意图,但是使用
flatMap()
应该可以让您达到目的(可能与
IntStream
结合使用)。我可以将现有的streamL或streamL2以及新添加的元素(test2)与flatMap放在同一个流中,而不是concat,但是我真的不知道这对我的问题是否有帮助。在第一块中,我在streamL的forEach之前生成streamL2,并将所有新生成的元素添加到streamL2,然后在forEach的末尾,我检查streamL2是否为空,如果不是,我将此流返回给useOfStream方法。在第二个块中,我没有创建任何streamL2,而是尝试向streamL添加新元素,我正在forEach循环通过
.flatMap(t->Stream.concat(Stream.of(t),IntStream.range(1,3).mapToObj(I->“B”+I))
非常感谢,因此无法避免我的递归方法。如果我想迭代新元素并做同样的事情,我必须使用新的flatmapped流作为参数来调用我的方法。只有当Stream.of(“A1”、“A2”)的所有元素都被flatMap()方法循环通过时,才会实例化返回子流.build()?
A1B1B2A2B1B2