欢迎使用函数式编程
首先,您的用例可以使用mutable map。您使用了immutable map,因为它在 Scala 中默认可用。 scala.Predef 包中的所有内容默认在 Scala 中可用,默认情况下您不需要导入它。
下面的代码作为例外工作。
import scala.collection.mutable.Map
val gMap = Map[Int, String]()
def getUserInputs(lMap: Map[Int, String]) = {
lMap += (1-> "ss")
}
下面的调用会改变gMap的内容
getUserInputs(gMap)
这是证据
scala> import scala.collection.mutable.Map
import scala.collection.mutable.Map
scala>
| val gMap = Map[Int, String]()
gMap: scala.collection.mutable.Map[Int,String] = Map()
scala>
| def getUserInputs(lMap: Map[Int, String]) = {
| lMap += (1-> "ss")
| }
getUserInputs: (lMap: scala.collection.mutable.Map[Int,String])scala.collection.mutable.Map[Int,String]
scala> getUserInputs(gMap)
res2: scala.collection.mutable.Map[Int,String] = Map(1 -> ss)
scala> gMap
res3: scala.collection.mutable.Map[Int,String] = Map(1 -> ss)
在最后一个 Scala repl 中注意 gMap 的内容。 gMap 包含添加的项目。
一般代码改进
除非你有充分的理由使用它,否则不要使用可变集合。
如果是不可变集合,则在完成更改现有数据结构的操作时会返回新实例。这样现有的数据结构不会改变。这在很多方面都很好。这确保了程序的正确性,也确保了所谓的引用透明性(阅读它)。
所以你的程序理想情况下应该是这样的
val gMap = Map.empty[String, String] //Map[String, String]()
def getUserInputs(lMap: Map[Int, String]) = {
lMap += (1-> "ss")
}
val newMap = getUserInputs(gMap)
内容被添加到newMap 并且旧地图没有改变,保持不变。这非常有用,因为保留gMap 并访问gMap 的代码不必担心底层结构发生的变化。(假设在多线程场景中,它非常有用。)
保持原始结构不变并为更改的状态创建新实例是函数式编程中处理状态的一般方式。所以理解这一点并实践这一点很重要。
Scala 2.12 中已弃用的语法及其删除
你像下面这样声明了你的函数
def getUserInputs(lMap: Map[Int, String]) { // no = here
lMap += (1-> "ss")
}
在上述函数定义中,右括号后没有=。这在 Scala 2.12 中已被弃用。所以不要使用它,因为 Scala 编译器使用这种函数声明语法会产生误导性的编译错误。
正确的做法是这样。
def getUserInputs(lMap: Map[Int, String]) = {
lMap += (1-> "ss")
}
请注意,此语法中有 =。