Ленивая оценка потоковых конвейеров в Java не имеет ничего общего с лямбдами.
Все, кроме последних станций в потоковом конвейере , оцениваются только тогда, когда последниеСтанция просит больше данных.Когда последняя станция тянет одну секунду от последней, эта тянет от предыдущей и т. Д. До тех пор, пока, наконец, запрос новых данных не дойдет до поставщика.Затем поставщик предоставляет следующее значение, которое передается обратно (фактически вперед) по конвейеру до последней стадии (сборщик или forEach), и цикл повторяется.
Этот подход не требует реализации конвейера более чем-произвести и / или буферизовать что-либо.Это отлично подходит для использования процессора и памяти, что обычно является большим отклонением для приложений Java.
Пример:
Stream
.generate(new Random(42)::nextLong) // <-- supplies the next random number every time the next station pulls it
.limit(5) // <-- pulls from the generator when is pulled itself
// terminates the pipeline after 5 pulls
.collect(toList()); // <-- pulls data from the pipeline into the list