+演算子でMapに要素を追加・上書きする方法

Scala 3 (Dotty 0.26.0-RC1) 2.13.3 2.12.12
最終更新:2020年5月19日

[AD] scalapediaでは記事作成ボランティアを募集しています

Mapに要素を追加する方法について解説します。

サンプルのMapはこちらです。
Userクラスと、各ユーザーをMapにまとめた変数mapを宣言します。

val map: Map[Int, User] = Map( 1 -> User("Andrea", "Thompson"), 2 -> User("Austin", "May"), 3 -> User("John", "Winston"), 4 -> User("Christina", "Chandler"), 5 -> User("John", "Thompson") )

+メソッドを使用して要素を追加する

Mapに要素を追加するには+メソッドを用います。
こちらは最もおすすめの書き方です。

val newMap = map + (6 -> User("Gloria", "Barney")) newMap.foreach(println)

出力は以下のようになります(順不同)。
要素が追加されているのがわかります。

(1,User(Andrea,Thompson)) (2,User(Austin,May)) (3,User(John,Winston)) (4,User(Christina,Chandler)) (5,User(John,Thompson)) (6,User(Gloria,Barney))

この際、元の変数map自体は変化しません。
今度は変化していないことを確認するために、要素を追加したあとにnewMapではなくmapを出力してみましょう。

map + (6 -> User("Gloria", "Barney")) map.foreach(println)

出力は以下のようになります(順不同)。
含まれている要素の個数、内容ともに変化がないことがわかります。

(1,User(Andrea,Thompson)) (2,User(Austin,May)) (3,User(John,Winston)) (4,User(Christina,Chandler)) (5,User(John,Thompson))

別の書き方で要素を追加する

同じ処理に対して複数の表現ができることの多いScalaですが、 Mapに要素を加える処理についても異なる書き方をすることができます。

Mapに要素を加える場合、要素をアローではなくタプルとして渡すことができます。
「前処理の結果、タプルが返ってくる」といった場合にもそのまま投入できることを覚えておきましょう。

val newMap = map + ((6, User("Gloria", "Barney"))) newMap.foreach(println)

出力は以下のようになります(順不同)。
ほどと同様、要素が追加されているのがわかります。

(1,User(Andrea,Thompson)) (2,User(Austin,May)) (3,User(John,Winston)) (4,User(Christina,Chandler)) (5,User(John,Thompson)) (6,User(Gloria,Barney))

要素の上書きをする

+メソッドを使用する際、既存のキーを指定すると既存の要素を上書きすることができます。

val newMap = map + (1 -> User("Gloria", "Barney")) newMap.foreach(println)

上書きする場合も、要素をアローではなくタプルとして渡すこともできます。

val newMap = map + ((1, User("Gloria", "Barney"))) newMap.foreach(println)

出力はそれぞれ以下のようになります(順不同)。
素が上書きされていることがわかります。

(1,User(Gloria,Barney)) (2,User(Austin,May)) (3,User(John,Winston)) (4,User(Christina,Chandler)) (5,User(John,Thompson))

ただし、この場合も、元のmapは上書きされないことに気をつけましょう。
今度は要素を追加したあとにnewMapではなくmapを出力してみましょう。

map + (1 -> User("Gloria", "Barney")) map.foreach(println)

出力は以下のようになります(順不同)。
素が上書きされていないことがわかります。

(1,User(Andrea,Thompson)) (2,User(Austin,May)) (3,User(John,Winston)) (4,User(Christina,Chandler)) (5,User(John,Thompson))

(2.12まで) 複数の要素を追加する

Scala 2.12までは、+メソッドは可変長引数をとっていたので、一度に複数の要素を渡して追加することができました。

val newMap = map + ( 6 -> User("Gloria", "Barney"), 7 -> User("Jill", "MacCawley"), 8 -> User("Edward", "Hamill") ) newMap.foreach(println)

複数渡す場合にも、それぞれの要素はタプルの状態で渡すことができます。

val newMap = map + ( (6, User("Gloria", "Barney")), (7, User("Jill", "MacCawley")), (8, User("Edward", "Hamill")) ) newMap.foreach(println)

出力はいずれも以下のようになります(順不同)。
数の要素が追加されていることがわかります。

(1,User(Andrea,Thompson)) (2,User(Austin,May)) (3,User(John,Winston)) (4,User(Christina,Chandler)) (5,User(John,Thompson)) (6,User(Gloria,Barney)) (7,User(Jill,MacCawley)) (8,User(Edward,Hamill))

(2.12まで) 複数いっぺんに要素を上書きする

Scala 2.12までは、複数同時に上書きすることもできました。

val newMap = map + ( 1 -> User("Gloria", "Barney"), 2 -> User("Jill", "MacCawley"), 3 -> User("Edward", "Hamill") ) newMap.foreach(println)

タプルで渡す場合は以下のように記述します。

val newMap = map + ( (1, User("Gloria", "Barney")), (2, User("Jill", "MacCawley")), (3, User("Edward", "Hamill")) ) newMap.foreach(println)

出力はそれぞれ以下のようになります(順不同)。
数の要素が上書きされていることがわかります。

(1,User(Gloria,Barney)) (2,User(Jill,MacCawley)) (3,User(Edward,Hamill)) (4,User(Christina,Chandler)) (5,User(John,Thompson))

サイト内検索