, как указал @ziggystar, Streams
сохраняет список ранее вычисленных значений в памяти, поэтому использование Iterator
является большим улучшением.
для дальнейшего улучшения ответа, я бы сказал, что "бесконечно«потоки», обычно вычисляются (или могут быть вычислены) на основе предварительно вычисленных значений.если это так (а в вашем факториальном потоке это определенно так), я бы предложил вместо этого использовать Iterator.iterate
.
выглядело бы примерно так:
scala> val it = Iterator.iterate((1,BigInt(1))){case (i,f) => (i+1,f*(i+1))}
it: Iterator[(Int, scala.math.BigInt)] = non-empty iterator
тогда вы могли бысделайте что-то вроде:
scala> it.find(_._2 >= Long.MaxValue).map(_._1).get - 1
res0: Int = 22
или используйте @ziggystar sliding
решение ...
другим простым примером, который приходит на ум, будут числа Фибоначчи:
scala> val it = Iterator.iterate((1,1)){case (a,b) => (b,a+b)}.map(_._1)
it: Iterator[Int] = non-empty iterator
в этих случаях вы не каждый раз вычисляете новый элемент с нуля, а вместо этого выполняете работу O (1) для каждого нового элемента, что еще больше улучшит ваше время выполнения.