web-dev-qa-db-ja.com

Scalaタプルからのマップ反復可能

他のコレクションから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を構築するためのより良い方法はありますか?

21
themel

Traversable/Iterableの要素のタイプがTraversableOnce.toMapの場合に定義されるTuple2を使用します。 (API)

val map = foo.map(x=>(x, f(x)).toMap
31
Debilski

または、collection.breakOutCanBuildFrom呼び出しの暗黙的な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 -> ----)
5
retronym
val map = foo Zip (foo map f) toMap
2
Landei