flatten + mapというふうに解釈されるflatMapだけど、たぶんいろいろな使い方があったりする。 期待する動作をやらせたいのであればflattenとmapを組み合わせてもいいし、逆にmapだけ、flattenだけでもよかったりする。 このあたりの挙動がよくわかっていない。
flatMapの中の関数の戻り値はscala.collection.GenTraversableOnce[?]だったりするらしいので、そこらへんの挙動に躓いてお亡くなりになることもある。
scala> List("1,1,1","2","3").flatMap(_.split(",")) res0: List[String] = List(1, 1, 1, 2, 3) scala> List("1,1,1","2","3").map(_.split(",")) res1: List[Array[String]] = List(Array(1, 1, 1), Array(2), Array(3)) scala> Seq(Seq("hello", "world"), Seq("good", "morning")).flatMap(_.mkString(" ").toUpperCase) res2: Seq[Char] = List(H, E, L, L, O, , W, O, R, L, D, G, O, O, D, , M, O, R, N, I, N, G) scala> Seq(Seq("hello", "world"), Seq("good", "morning")).map(_.mkString(" ").toUpperCase) res3: Seq[String] = List(HELLO WORLD, GOOD MORNING) scala> Seq(Seq(1,2,3), Seq(), Seq(5,6)) flatMap { x => x.size } // error <console>:11: error: type mismatch; found : Int required: scala.collection.GenTraversableOnce[?] Seq(Seq(1,2,3), Seq(), Seq(5,6)) flatMap { x => x.size } // error ^ scala> Seq(Seq(1,2,3), Seq(), Seq(5,6)) map { x => x.size } res5: Seq[Int] = List(3, 0, 2)