Scala Streamで無限に要素をもつコレクションをあつかう

Scala Standard Library 2.12.8 - scala.collection.immutable.Streamをつかうと、無限に要素をもつコレクションをあつかえるらしい。

実際のところは、要素の生成を後回しにして、無限の要素があるかのようにふるまうということらしい。

Javaだと、なつかしいところで、http://commons.apache.org/collections/apidocs/org/apache/commons/collections/list/LazyList.htmlこんなのもつかったことあったなあ。

Streamもやっぱり、要素を生成する処理を記述して、使用する。

scala> def makeSameElement(x: Int): Stream[Int] = Stream.cons(x, makeSameElement(x))
makeSameElement: (x: Int)Stream[Int]

scala> makeSameElement(1) take 10
res6: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> val a = makeSameElement(1) take 10
a: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> a foreach println
1
1
1
1
1
1
1
1
1
1

Stream.consは、#::でもよいらしい。

scala> def makeNaturalNumber(x: Int): Stream[Int] = x #:: makeNaturalNumber(x + 1)
makeNaturalNumber: (x: Int)Stream[Int]

scala> val b = makeNaturalNumber(1) take 10
b: scala.collection.immutable.Stream[Int] = Stream(1, ?)

scala> b.foreach(println)
1
2
3
4
5
6
7
8
9
10

scala>