Потоки похожи на списки, которые генерируют своих членов по мере необходимости. Как только элемент сгенерирован, он сохраняется в потоке и используется повторно.
Например:
lazy val naturals: Stream[Int] = Stream.cons(0, naturals.map{_ + 1})
даст вам поток натуральных чисел. Если я позвоню
naturals(5)
будет генерировать элементы 0-5 и возвращать 5, если я тогда позвоню
naturals(8)
Он будет повторно использовать первые 6 элементов и генерировать еще 3.
Если вас беспокоит использование памяти, вы можете использовать Stream.drop(num)
для создания нового потока с элементами num
, удаленными с самого начала, что позволяет собирать усеченные элементы со старым потоком. Например:
naturals(5) //returns 5
val truncated = naturals.drop(4)
truncated(5) //returns 9