Iterator
要素を必要になったときに作成して返す仕組みとしてはStreamのほかにIteratorもあります。hasNext(),next()を持つアレです。Java使いにはこっちの方がわかりやすいかも。
以下はフィボナッチ数を順に返すイテレータのサンプルです。
- Iteratorを継承した無名クラスを作成して、next(),hasNext()をオーバーライドしています。
- ScalaByExampleのサンプルがこんな風になってた。
- Iteratorはforeachやfilterを実装しているので、forループのジェネレータとして指定できます。
// maxまでのフィボナッチ数を順に返すイテレータを作る関数 def fibonacci( max:Int ) = new Iterator[Int] { var f = 0 var s = 1 def hasNext:Boolean = s+f <= max def next:Int = { var n = f+s f = s s = n n } } // 実行。1から20までのフィボナッチ数を表示 for ( fib <- fibonacci(20) ) println(fib)
実行結果です。
1 2 3 5 8 13
なお、
def fibonacci( max:Int ) = new Iterator[Int] { ...
となっていますが、fibonacciに Iteratorが代入されてたりするわけではないです。Java使い向けには↓のように書くと何しているかわかりやすいかも。
// maxまでのフィボナッチ数を順に返すイテレータを作る関数 def fibonacci( max:Int ):Iterator[Int] = { return new Iterator[Int] { var f = 0 var s = 1 def hasNext:Boolean = { return s+f <= max } def next:Int = { var n = f+s f = s s = n return n } } }