尝试更新对象时,在scala中重新分配给val

时间:2016-07-25 09:10:44

标签: scala

我试图将一个对象添加到scala中的子列表(thirdList),所以我有一个第一个循环,我循环第一个对象和第二个循环,我在第二个子列表中循环查找对象我尝试将我的新对象添加到列表(thirdList)这是我的代码:

        if (!firstList.isEmpty) {
          for (firstObject <- firstList) {
            if (firstObject.rank == firstObjectRank) {
              println("ok")
              var secondList = firstObject.secondList
              if (!secondList.isEmpty) {
                for (secondObject <- secondList) {
                  if (secondObject.rank == secondObjectRank) {
                    println("ok 2")
secondObject.thirdList = secondObject.thirdList :+ myNewObject
                  } else {
                    println("secondObject not found")
                  }
                }
              }
            } else {
              println("firstObject not found")
            }
          }
        } else {
          println("firstList is empty")
        }

这是我的结构:

{
"firstList": [
{ "firstObject" : "ObjectFirstList"},
{
"secondList" : [
{"secondObject" : "ObjectSecondList"},
"thirdList" : [
{"thirdObject" : "ObjectThirdList"}
]
]
}
]
}

1 个答案:

答案 0 :(得分:1)

在功能语言中,如Scala,您应该使用不可变数据结构。它们无法更新,这会导致许多有用的特征 - 对此类的解释超出了这个问题。

关键字val代表价值。分配后,您无法重新分配,即再次使用=运算符:

secondObject.thirdList = {...}

关键字var代表变量。你可以自由地重新分配它。 作为旁注,Scala中的变量和值(在其他语言中称为常量)故意区别一个字符,以鼓励人们使用后者。

要彻底,我应该提到Scala中的List是不可变的,

secondObject.thirdList :+ myNewObject

返回一个新对象而不是更新现有对象

足够的理论。您的类定义可能如下所示:

class A {
  val thirdList = List()
}

请注意,您已使用=

为val分配了一些内容

这里有2个选项:

  1. val替换为var - 您的代码段会按原样运作,因为var允许重新分配
  2. List替换为一些可变数据结构,即MutableList。 此时,您的代码仍然无法正常工作,因为结构的突变和重新赋值是两个不同的东西。使用=仍然是非法的。您可以使用

    替换整行
    secondObject.thirdList += myNewObject
    

    第二种选择是更好的恕我直言。

  3. 顺便说一下,使用Scala Collections的强大功能可以大大缩短您的代码。看看它们,例如从:

    开始
    firstList.find(object => object.rank == firstObjectRank).map(_.secondList).find(object => object.rank == secondObjectRank)