Как поток может создаваться лениво? Во время миграции кода на основе коллекции я несколько раз сталкивался с этим шаблоном:
Collection collection = veryExpensiveCollectionCreation();
return Stream.concat(firstStream, collection.stream());
Полученный конкатенированный поток обычно обрабатывается лениво, как мы знаем. Поэтому дорогая коллекция вообще не нужна, если обработка потока останавливается в первой части конкатенированного потока.
Поэтому по соображениям производительности я хотел бы отложить создание всей коллекции до тех пор, пока конкатенированный поток не попытается выполнить итерацию элементов второй части конкатенации.
Псевдо код будет выглядеть как
return Stream.concat(firstStream, new LazyStreamProvider() {
Stream<Something> createStream() {
return veryExpensiveCollectionCreation().stream();
}
);
Изменить: я знаю, что реорганизация создания коллекции в потоки была бы лучше всего, чтобы весь поток API был известен. Однако в этом случае это часть другого компонента с не модифицируемым API.