填充不可变列表

时间:2015-01-22 14:45:49

标签: scala

这里我填充两个列表,其中每个列表是可变的或不可变的:

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?

2 个答案:

答案 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)