我试图将一个对象添加到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"}
]
]
}
]
}
答案 0 :(得分:1)
在功能语言中,如Scala,您应该使用值和不可变数据结构。它们无法更新,这会导致许多有用的特征 - 对此类的解释超出了这个问题。
关键字val
代表价值。分配后,您无法重新分配,即再次使用=
运算符:
secondObject.thirdList = {...}
关键字var
代表变量。你可以自由地重新分配它。
作为旁注,Scala中的变量和值(在其他语言中称为常量)故意区别一个字符,以鼓励人们使用后者。
要彻底,我应该提到Scala中的List
是不可变的,
secondObject.thirdList :+ myNewObject
返回一个新对象而不是更新现有对象
足够的理论。您的类定义可能如下所示:
class A {
val thirdList = List()
}
请注意,您已使用=
这里有2个选项:
val
替换为var
- 您的代码段会按原样运作,因为var
允许重新分配将List
替换为一些可变数据结构,即MutableList
。
此时,您的代码仍然无法正常工作,因为结构的突变和重新赋值是两个不同的东西。使用=
仍然是非法的。您可以使用
secondObject.thirdList += myNewObject
第二种选择是更好的恕我直言。
顺便说一下,使用Scala Collections的强大功能可以大大缩短您的代码。看看它们,例如从:
开始firstList.find(object => object.rank == firstObjectRank).map(_.secondList).find(object => object.rank == secondObjectRank)