Если вы хотите n-е число Фибоначчи и использовать поток просто как временную структуру данных (если вы не храните ссылки на ранее вычисленные элементы потока), тогда ваш алгоритм будет работать в постоянном пространстве.Ранее вычисленные элементы потока (которые больше не используются) собираются для сбора мусора.И поскольку они были выделены в самом молодом поколении и сразу же собраны, почти все выделения могут находиться в кеше.
Обновление:
Кажется, что текущая реализация Stream не так эффективна, какэто может быть связано главным образом с тем, что он наследует реализацию метода apply
от черты LinearSeqOptimized, где он определен как
<code>
def apply(n: Int): A = {
val rest = drop(n)
if (n < 0 || rest.isEmpty) throw new IndexOutOfBoundsException("" + n)
rest.head
}
Ссылка на заголовок потока удерживается здесь
this
и предотвращает поток от gc'ed.Таким образом, комбинация методов
drop
и
head
(как в
f.drop(100).head
) может быть лучше для ситуаций, когда выпадение промежуточных результатов возможно.(спасибо Себастьяну Боку за объяснение этого материала на scala-user).