Создать поток лениво

Как поток может создаваться лениво? Во время миграции кода на основе коллекции я несколько раз сталкивался с этим шаблоном:

Collection collection = veryExpensiveCollectionCreation();
return Stream.concat(firstStream, collection.stream());

Полученный конкатенированный поток обычно обрабатывается лениво, как мы знаем. Поэтому дорогая коллекция вообще не нужна, если обработка потока останавливается в первой части конкатенированного потока.

Поэтому по соображениям производительности я хотел бы отложить создание всей коллекции до тех пор, пока конкатенированный поток не попытается выполнить итерацию элементов второй части конкатенации.

Псевдо код будет выглядеть как

return Stream.concat(firstStream, new LazyStreamProvider() {
    Stream<Something> createStream() {
         return veryExpensiveCollectionCreation().stream();
    }
);

Изменить: я знаю, что реорганизация создания коллекции в потоки была бы лучше всего, чтобы весь поток API был известен. Однако в этом случае это часть другого компонента с не модифицируемым API.

Ответ 1

Возможно, это не лучшее решение, но вы можете создать свою коллекцию в методе flatMap, чтобы он был создан лениво:

return Stream.concat(
        firstStream, 
        Stream.of(Boolean.TRUE).flatMap(ignoredBoolean -> veryExpensiveCollectionCreation().stream())
);