Конкатенация потока в собственном цикле forEach - PullRequest
0 голосов
/ 19 марта 2019

Пример 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 также проходить через эти вновь добавленные элементы?Это избавило бы меня от необходимости рекурсивного метода.Другой вопрос, будет ли программа лениво обрабатывать объект, созданный в потоке (например, Test test2 = new Test(); в цикле forEach в streamL)?Другими словами, будет ли этот объект занимать какое-то место в куче памяти?(но этот вопрос не так важен, в первую очередь мой первый вопрос)

1 Ответ

1 голос
/ 19 марта 2019

Вы можете заменить сначала 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
...