読者です 読者をやめる 読者になる 読者になる
無料で使えるシステムトレードフレームワーク「Jiji」 をリリースしました!

・OANDA Trade APIを利用した、オープンソースのシステムトレードフレームワークです。
・自分だけの取引アルゴリズムで、誰でも、いますぐ、かんたんに、自動取引を開始できます。

Iterator

要素を必要になったときに作成して返す仕組みとしてはStreamのほかにIteratorもあります。hasNext(),next()を持つアレです。Java使いにはこっちの方がわかりやすいかも。

以下はフィボナッチ数を順に返すイテレータのサンプルです。

  • Iteratorを継承した無名クラスを作成して、next(),hasNext()をオーバーライドしています。
  • 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
    }
  }
}