Ответ 1
Потоки похожи на списки, которые генерируют их члены, как они требуются. Как только элемент был сгенерирован, он сохраняется в потоке и повторно используется.
Например:
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