他のコレクションからscala.collection.Map
を作成していると、私は常に次のように書いています。
val map = Map(foo.map(x=>(x, f(x)))
ただし、Map.apply
は可変引数のみを取るため、これは実際には機能しません。したがって、次のように記述する必要があります。
val map = Map(foo.map(x=>(x, f(x)) toSeq :_*)
私が欲しいものを手に入れるために、しかしそれは苦痛のようです。タプルのMap
からIterable
を構築するためのより良い方法はありますか?
Traversable/Iterableの要素のタイプがTraversableOnce.toMap
の場合に定義されるTuple2
を使用します。 (API)
val map = foo.map(x=>(x, f(x)).toMap
または、collection.breakOut
をCanBuildFrom
呼び出しの暗黙的なmap
引数として使用することもできます。これにより、予想されるタイプに基づいて結果ビルダーが選択されます。
scala> val x: Map[Int, String] = (1 to 5).map(x => (x, "-" * x))(collection.breakOut)
x: Map[Int,String] = Map(5 -> -----, 1 -> -, 2 -> --, 3 -> ---, 4 -> ----)
コレクションを1回だけ繰り返すため、.toMap
バージョンよりもパフォーマンスが向上します。
それはそれほど明白ではありませんが、これは理解のためにも機能します。
scala> val x: Map[Int, String] = (for (i <- (1 to 5)) yield (i, "-" * i))(collection.breakOut)
x: Map[Int,String] = Map(5 -> -----, 1 -> -, 2 -> --, 3 -> ---, 4 -> ----)
val map = foo Zip (foo map f) toMap