Posted at

ScalaでMapのmapの挙動の注意点

知らなかったのでメモ。

Mapのmapメソッドは、mapに渡す関数の返り値型によって、mapの返却値の型はMapになるときとListになる時がある。

この違いに気づかず若干ハマった。


結論

調べた範囲では、map(f: A => B)とすると、以下結論になる。


  • B がタプルもしくはc -> dの形の場合はmapの返り値はMap

  • B がそれ以外の場合は返り値はList


以下、同じMapのmapメソッドでも、map1, map2はMap型、list1はList型として変える。

object MapConversion extends App {

val newMap = Map("1" -> 1, "2" -> 2, "3" -> 3)

val map1 = newMap.map {
case (_, value) => (Math.random(), value)
}

val map2 = newMap.map {
case (_, value) => Math.random() -> value
}

val list1 = newMap.map {
case (_, value) => value
}

println(map1) // => Map(0.15985975180002765 -> 1, 0.6619101600969522 -> 2, 0.18256060363818238 -> 3)
println(map2) // => Map(0.31876372630036387 -> 1, 7.773814391255351E-4 -> 2, 0.2837391028402594 -> 3)
println(list1) // => List(1, 2, 3)
}

ソースを見て挙動を確認したいが難しいので諦める。