在“Scala编程”中,声明列表是不可变的,并且数组是可变的。但是我不能改变数组长度 - 我也不能用list,所以这样它们都是不可变的。我可以更改数组的元素值 - 只需设置一个新的元素值,我可以用map方法修改列表的元素值。所以这样他们都是可变的。
那么为什么数组被认为是可变的并且没有列出?
答案 0 :(得分:10)
首先,重要的是要知道Scala实际上同时具有可变和不可变的集合。如果您使用scala.collection.mutable.ListBuffer
,它(如名称所示)将是可变的。如果您使用scala.collection.immutable.List
则不会。
其次,map
函数不会改变列表的元素,而是创建一个全新的列表,其中包含应用于起始列表的每个元素的map函数的结果,例如:
var l1 = List(1,3,5)
var l2 = l1.map( _ + 2 )
println(l1) // List(1, 3, 5)
println(l2) // List(2, 4, 6)
l2
现在包含一个新列表,与l1
完全分开,l1
尚未更改。
答案 1 :(得分:3)
您无法转换List的元素 - 如果您使用转换元素的函数创建了一个新的List:
scala> val xs = List(1,2,3)
xs: List[Int] = List(1, 2, 3)
scala> xs.map(_+1)
res0: List[Int] = List(2, 3, 4)
scala> xs
res1: List[Int] = List(1, 2, 3)
相比之下,数组的元素是可变的:
scala> val xs = Array(1,2,3)
xs: Array[Int] = Array(1, 2, 3)
scala> xs(0) = 5
scala> xs
res3: Array[Int] = Array(5, 2, 3)
scala> val xs = List(1,2,3)
xs: List[Int] = List(1, 2, 3)
scala> xs(0) = 5
<console>:9: error: value update is not a member of List[Int]
xs(0) = 5
^
尽管如此,您无法更改数组的大小。如果你想这样做,你必须使用scala.collection.mutable.Buffer
:
scala> val xs = Array(1,2,3)
xs: Array[Int] = Array(1, 2, 3)
scala> xs += 4
<console>:9: error: reassignment to val
xs += 4
^
scala> val xs = collection.mutable.Buffer(1,2,3)
xs: scala.collection.mutable.Buffer[Int] = ArrayBuffer(1, 2, 3)
scala> xs += 4
res6: xs.type = ArrayBuffer(1, 2, 3, 4)
答案 2 :(得分:1)
List的map方法将创建一个新列表。
如果你想使用一个可变的集合,请参阅 * scala.collection.mutable包。