这里我填充两个列表,其中每个列表是可变的或不可变的:
var mutableList = scala.collection.mutable.MutableList[String]()
//> mutableList : scala.collection.mutable.MutableList[String] = MutableList()
//|
for (a <- 1 to 100) {
mutableList += a.toString
}
println(mutableList.size); //> 100
val immutableList = List[String]() //> immutableList : List[String] = List()
for (a <- 1 to 100) {
immutableList :+ a.toString
}
println(immutableList.size); //> 0
当我打印immutableList的大小时,它的输出为0.这是因为在for循环中创建了一个不指向immutableList的新引用?是否有一个功能等同于从循环中填充不可变List?
答案 0 :(得分:3)
正如Gabor在评论中回答的那样,您希望使用fold
,或者继续使用for和yield
。他没有解释的是为什么你的大小为0.原因是immutableList :+ a.toString
每次都返回一个新的列表,你没有使用它。 immutableList
就是那个,不可变的。
请记住,Scala中的所有内容都是表达式,因此会返回一些内容。因此,您可以通过添加for
(如下所示)将常规forEach
(其行为类似yield
)变为理解
val immutableList = for (a <- 1 to 100) yield a.toString
这类似于:
(1 to 100).map(_.toString)
答案 1 :(得分:1)
为了完整性,方法tabulate
允许创建和填充不可变List
,例如,如下所示,
List.tabulate(100)(a => a.toString)
或等效
List.tabulate(100)(_.toString)