2012-04-12 10 views
3

はよく、私は自分自身が入力ソースからのマップを構築する方法を実装見つけます。この場合、私はscala.collection.mutable.Mapを使用します。しかし、いったんこのコレクションが構築されると、もはやそれが変更可能であることは望ましくありません。ローカルに構築された変更可能なマップから不変のマップを返す好ましい方法は何ですか?

変更可能なマップから不変のマップを返すために推奨されるScalaの方法は何ですか?通常、私はmyMap.toMapを実行しますが、明らかに機能しますが、においがします。また、戻り値の型をscala.collection.Mapに設定することもできます。この場合、新しいコレクションを作成する必要はありませんが、読者を混乱させる可能性があります。

ありがとうございました。

+0

私は、[この他の質問](http://stackoverflow.com/questions/26079146/scala-initializing-mutable-maps-and-exposing-them-as-immutable/26081768#のように 'newBuilder'を使用して考えます26081768) '.result'は、変更可能な' Map'を定義する上で、いくつかのスタイルメリットを持つ同等の解決策になります – matanster

答えて

7

最良の方法は、.toMapを呼び出すことです。それは短く、きれいで、あなたのコレクションをimmutable.Mapに変換したいという明示的な方法です。

私はscala.collection.Mapにタイプを設定すると、確かに、混乱すると思います。また、タイプを戻す人からあなたを守ることはできません。タイプimmutable.Mapを作成することは明確かつ安全です。

5

.toMapはなぜ匂いがするのかわかりませんが、明示したい場合は、collection.immutable.Map() ++ myMapは何が起こっているのかを明確に文書化する必要があります。 (()忘れないでください、彼らはオプションではありませんよ。)

だけで完全に不変性の問題が解決しない戻り値の型を変更します。突然変異の方法はもはや見ることができないが、ユーザは容易に逆戻りする可能性がある。しかし、実際には何も変化していないので、これは最高のパフォーマンスのアプローチです。

+0

あなたと@ dhgの両方の応答を読み終えたら、toMapが最適なソリューションです。私は 'toMap'は私に匂いがしていたと思います。なぜなら、私は変更可能なメソッドを隠したいだけだったので、既存のコレクションから新しいコレクションを作成するのは間違っていたからです。 (私は非常に大規模なコレクションを扱っています。)言われているように、私は、クライアントがそれを根本的な変更可能な型に戻すことができたことを忘れました。 タイプセーフなソリューションftw。 – pathdependent

+0

@pathdependent - スピードが重要な場合は、必ずそれが可変マップを構築してからちょうど一から不変のマップを構築するよりも、不変のマップに追加するには、より高速だことを確認するためにチェックする必要があります。スペースが重要な場合は、一度に不変のマップを作成することを奨励したいので、同時に2つのマップを表示する必要はありません。 –

0
import scala.collection._ 
import scala.collection.JavaConversions._ 

val myMap: mutable.Map[K,V] = ??? 
val unmodifiable: mutable.Map[K,V] = 
    java.util.Collections.unmodifiableMap[K,V](myMap) 
val newMap = unmodifiable.asInstanceOf[scala.collection.Map[K,V]] 

あなたはmutable.MapnewMapをキャストすることができますが、変更はUnsupportedOperationExceptionをスローします。

私の場合、マップはtoMapがより速くなると、より少ないメモリを使用することが十分に小さくすることができます。

関連する問題