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