by shigemk2

当面は技術的なことしか書かない

flatMapいろいろ

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)

qiita.com