mapのタイミング

mapが実行されるタイミングの確認。

val a = List(1, 2, 3)

def withPrint(x: Int): Int = {
  println(x)
  x
}

println("List Map")
val b = a.map(withPrint)

println("foreach")
b.foreach { x =>
  println("1st loop %s".format(x));
}

println("foreach")
b.foreach { x =>
  println("2nd loop %s".format(x));
}

println("Iterator Map")
val it = a.iterator.map(withPrint)

println("foreach")
it.foreach { x =>
  println("1st loop %s".format(x));
}

println("foreach")
it.foreach { x =>
  println("2nd loop %s".format(x));
}


println("Stream Map")
val strm = Stream.concat(a).map(withPrint)

println("foreach")
strm.foreach { x =>
  println("1st loop %s".format(x));
}

println("foreach")
strm.foreach { x =>
  println("2nd loop %s".format(x));
}

上記のコードを実行すると以下の出力がでるため、

Listのmap その場で計算
iteratorのmap 値が必要になったら計算する。だたし、値を2回以上参照できない
Streamのmap 最初の要素だけその場で計算し、以降は必要になったら計算。

のタイミングでmapにくべた関数が実行されるよう

List Map
1
2
3
foreach
1st loop 1
1st loop 2
1st loop 3
foreach
2nd loop 1
2nd loop 2
2nd loop 3
Iterator Map
foreach
1
1st loop 1
2
1st loop 2
3
1st loop 3
foreach
Stream Map
1
foreach
1st loop 1
2
1st loop 2
3
1st loop 3
foreach
2nd loop 1
2nd loop 2
2nd loop 3