在自己的forEach循环中串联流

时间:2019-03-19 11:57:56

标签: 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 -> {
            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);
        }
    }

因此,对于streamL中的某个元素,我最多可以组成13个相同类的元素。这些新创建的元素(我已添加到streamL2中)应以与迭代streamL相同的方式进行迭代。是否可以将这些新元素添加到streamL中? 正在执行:

    streamL.forEach(test -> {
        for (int i = 1; i < 14; i++) {
            if (/*insert if statement*/) {
                Test test2 = new Test();
                Stream<Test> streamT = stream.of(test2);
                **streamL.concat(streamL, streamT);**
            } else {
                //do something with TestClass
            }
        }
    });

如果甚至有可能在自己的for-Each循环中合并流,那么forEach循环还会通过那些新添加的元素吗?那将消除我对递归方法的需要。 另一个问题是,程序中是否会延迟处理在流中创建的对象(例如streamL的forEach循环中的Test test2 = new Test();)?换句话说,这个对象会在内存堆中占据任何位置吗? (但是这个问题并不重要,主要是我的第一个问题)

1 个答案:

答案 0 :(得分:1)

您可以先将forEach替换为flatMap,然后使用Stream.builder()创建包含附加元素和重用的t元素的子流:

Stream.of("A1", "A2").flatMap(t -> {
    Stream.Builder<String> subStream = Stream.builder();
    subStream.add(t);
    for (int i = 1; i < 3; i++) {
        subStream.add("B" + i);
    }
    return subStream.build();
}).forEach(System.out::print);

打印

A1B1B2A2B1B2