更新Scala中ArrayBuffer的现有字符串元素

更新Scala中ArrayBuffer的现有字符串元素,scala,Scala,我有一个ArrayBuffer的Strings,如下所示: var myList = ArrayBuffer[String]() myList += "abc" myList += "def" 现在,我正试图根据某些条件更新ArrayBuffer中的字符串: for(item <- myList){ if(some condition){ item = "updatedstring" } } 对于(item我要指出的第一件事是,item与myList不同-它是myLis

我有一个
ArrayBuffer
Strings
,如下所示:

var myList = ArrayBuffer[String]()
myList += "abc"
myList += "def"
现在,我正试图根据某些条件更新
ArrayBuffer
中的
字符串

for(item <- myList){
  if(some condition){
    item = "updatedstring"
  }
}

对于(item我要指出的第一件事是,
item
myList
不同-它是
myList
中的一个元素,Scala迭代的工作方式是
val
。这与不变性相关的原因有很多,我在这里不作详细介绍

我建议改为:

val myNewList = myList.map(originalString =>
    if (someCondition) "xyz"
    else originalString
)

然后,如果您愿意,您可以执行
myList=myNewList
(或者完全放弃使用
myNewList
,执行
myList=myList.map(…)
)。

for循环中的
项是本地
val
。因此,它无法更改。 你可以:

迭代数组并更新每个项

myList.zipWithIndex foreach { case (item, index) if (condition) => myList.update(index, "updated") }
或者创建一个新的
ArrayBuffer

myList = (0 until myList.length).map { index => 
  val item = myList(index)
  if (condition) "updated" else item
}

您可以在上一个解决方案中使用
myList.index
,它返回的
范围与
(0到myList.length)
相同。