Scala 我将在函数中更新一些集合 我将把一些集合作为参数放入函数中,并更新这些集合

Scala 我将在函数中更新一些集合 我将把一些集合作为参数放入函数中,并更新这些集合,scala,Scala,查看注释lins,这里将出现一个错误:重新分配到val。如何解决这个问题,函数参数似乎是值,而不是变量 你说得对。函数参数被视为VAL,因此不支持重新分配。不支持var参数 您可以做的是创建var容器,然后将lob和pagesoflob中的元素复制到这些容器中。然后,您可以根据需要重新分配。问题是您无法更新传入的集合,因此必须返回一个结果 例如: def doSomething(xs: List[Int]): List[Int] = { var result = xs for (i &l

查看注释lins,这里将出现一个错误:重新分配到val。如何解决这个问题,函数参数似乎是值,而不是变量


你说得对。函数参数被视为VAL,因此不支持重新分配。不支持var参数

您可以做的是创建var容器,然后将lob和pagesoflob中的元素复制到这些容器中。然后,您可以根据需要重新分配。问题是您无法更新传入的集合,因此必须返回一个结果

例如:

def doSomething(xs: List[Int]): List[Int] = {
  var result = xs
  for (i <- 1 to 5) {
    result = result :+ i // Create new list on every iteration
  }
  return result
}

println(doSomething(List(1, 2, 3, 4, 5)))
// List(1, 2, 3, 4, 5, 1, 2, 3, 4, 5)
有很多更好的、惯用的方法,但如果您希望保持命令式方法,就可以使用这种方法

我将把一些集合作为参数放入函数中,并更新这些集合

那真是个坏主意

在学习Scala和函数编程时,学生应该避免坏习惯,如可变数据、返回单元的函数、foreach循环和其他依赖于副作用的构造

因此,该方法应该在内部构建和填充集合,并将它们作为3元素元组(也称为三元组)返回,而不是传递无法完成的可变集合

方法签名可能如下所示

def wrapEmailRportData(jsonString :String) :(List[String]
                                            ,Map[String,List[String]]
                                            ,Map[String,List[(String,List[Map[String,String]])]]
                                            ) = { . . .
val (lobs, pagesOfLob, summariesByPosOfLob) = wrapEmailRportData(jsonStr)
你可以这样调用它

def wrapEmailRportData(jsonString :String) :(List[String]
                                            ,Map[String,List[String]]
                                            ,Map[String,List[(String,List[Map[String,String]])]]
                                            ) = { . . .
val (lobs, pagesOfLob, summariesByPosOfLob) = wrapEmailRportData(jsonStr)

至于方法体,我确信返回元素都可以在不使用可变集合的情况下构建。从学习foldLeft开始,了解它的工作原理。

你说得对,非常感谢你的专业回答。