Scala 如何添加到列表中?斯卡拉

Scala 如何添加到列表中?斯卡拉,scala,Scala,我是scala的新手,不明白为什么这个列表不正确。当我运行这个程序时,我只得到List()作为输出,而我应该得到参数平方的所有元素的列表。这应该是非常简单的,但操作是我在网上发现的,它不起作用 def Squareall (l: List[Int]): List[Int] ={ var r : List[Int]=List() for (i<-0 to l.length-1){ r:+ l(i)*l(i) } return r } def Squareall(l:

我是scala的新手,不明白为什么这个列表不正确。当我运行这个程序时,我只得到List()作为输出,而我应该得到参数平方的所有元素的列表。这应该是非常简单的,但操作是我在网上发现的,它不起作用

def Squareall (l: List[Int]): List[Int] ={
  var r : List[Int]=List()
  for (i<-0 to l.length-1){
    r:+ l(i)*l(i)
  }
  return r
}
def Squareall(l:List[Int]):List[Int]={
var r:List[Int]=List()

对于(i您必须将新创建的列表分配给
r
,如下所示:

r = r:+ l(i)*l(i)
def squareAll (l: List[Int]): List[Int] = {
  for (i <- l) yield i * i
}
这是因为在Scala中,默认情况下
List
是不可变的,并且
:+
返回一个新列表,而不更新旧列表

当然,还有一个列表的可变变体
scala.collection.mutable.MutableList
。您可以在其上使用
++=
方法来增加集合

val mutableList = scala.collection.mutable.MutableList(1, 2)
mutableList.++=(List(3, 4))

Scala中通常避免使用示例中的命令式编码样式。Scala中的
for
是一个表达式,这意味着它会产生一个值,因此您可以直接转换输入列表。要使用
for
转换输入
列表
,可以执行以下操作:

r = r:+ l(i)*l(i)
def squareAll (l: List[Int]): List[Int] = {
  for (i <- l) yield i * i
}
甚至

def squareAll (l: List[Int]) = l.map(Math.pow(_, 2.0))

:+
返回新列表,而不是附加到当前列表。每次通过附加到当前
r
创建新列表时,您都需要重新分配
r
。因此…
r=r:+l(i)*l(i)
就个人而言,我认为使用这些操作符从来都不容易。除了我知道
x::Nil
做了什么之外。这些文档被认为非常混乱,以至于最近提出了PR,但因为困难太大而被拒绝。