How can I convert immutable.Map to mutable.Map in Scala?

后端 未结 6 1341
深忆病人
深忆病人 2020-12-02 21:55

How can I convert immutable.Map to mutable.Map in Scala so I can update the values in Map?

6条回答
  •  无人及你
    2020-12-02 22:29

    There is a variant to create an empty mutable Map that has default values taken from the immutable Map. You may store a value and override the default at any time:

    scala> import collection.immutable.{Map => IMap}
    //import collection.immutable.{Map=>IMap}
    
    scala> import collection.mutable.HashMap
    //import collection.mutable.HashMap
    
    scala> val iMap = IMap(1 -> "one", 2 -> "two")
    //iMap: scala.collection.immutable.Map[Int,java.lang.String] = Map((1,one), (2,two))
    
    scala> val mMap = new HashMap[Int,String] {      
         | override def default(key: Int): String = iMap(key)
         | }
    //mMap: scala.collection.mutable.HashMap[Int,String] = Map()
    
    scala> mMap(1)
    //res0: String = one
    
    scala> mMap(2)
    //res1: String = two
    
    scala> mMap(3)
    //java.util.NoSuchElementException: key not found: 3
    //  at scala.collection.MapLike$class.default(MapLike.scala:223)
    //  at scala.collection.immutable.Map$Map2.default(Map.scala:110)
    //  at scala.collection.MapLike$class.apply(MapLike.scala:134)
    //  at scala.collection.immutable.Map$Map2.apply(Map.scala:110)
    //  at $anon$1.default(:9)
    //  at $anon$1.default(:8)
    //  at scala.collection.MapLike$class.apply(MapLike.scala:134)....
    
    scala> mMap(2) = "three"
    
    scala> mMap(2)          
    //res4: String = three
    

    Caveat (see the comment by Rex Kerr): You will not be able to remove the elements coming from the immutable map:

    scala> mMap.remove(1)
    //res5: Option[String] = None
    
    scala> mMap(1)
    //res6: String = one
    

提交回复
热议问题