Use-cases for Streams in Scala

后端 未结 4 1451
孤街浪徒
孤街浪徒 2020-12-12 13:18

In Scala there is a Stream class that is very much like an iterator. The topic Difference between Iterator and Stream in Scala? offers some insights into the similarities a

4条回答
  •  时光说笑
    2020-12-12 13:36

    The main difference between a Stream and an Iterator is that the latter is mutable and "one-shot", so to speak, while the former is not. Iterator has a better memory footprint than Stream, but the fact that it is mutable can be inconvenient.

    Take this classic prime number generator, for instance:

    def primeStream(s: Stream[Int]): Stream[Int] =
      Stream.cons(s.head, primeStream(s.tail filter { _ % s.head != 0 }))
    val primes = primeStream(Stream.from(2))
    

    It can be easily be written with an Iterator as well, but an Iterator won't keep the primes computed so far.

    So, one important aspect of a Stream is that you can pass it to other functions without having it duplicated first, or having to generate it again and again.

    As for expensive computations/infinite lists, these things can be done with Iterator as well. Infinite lists are actually quite useful -- you just don't know it because you didn't have it, so you have seen algorithms that are more complex than strictly necessary just to deal with enforced finite sizes.

提交回复
热议问题