我对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
}
答案 0 :(得分:7)
在Scala中,通常可以避免示例中的命令式编码样式。 Scala中的for
是一个表达式,意味着它会产生一个值,因此您可以直接转换输入列表。要使用for
转换输入List
,您可以执行以下操作:
def squareAll (l: List[Int]): List[Int] = {
for (i <- l) yield i * i
}
如果您没有提供yield
语句,则for
会导致Unit
类型,类似于Java中的void
。这种for
循环的风格通常用于生成side effects,例如打印到屏幕或写入文件。如果您真的只想转换数据,则无需创建和操作生成的List
。 (此外,Scala中的方法名称通常是#34;骆驼套装&#34;。)
大多数人可能会使用List.map
方法,但是:
def squareAll (l: List[Int]) = l.map((x: Int) => x * x)
甚至......
def squareAll (l: List[Int]) = l.map(Math.pow(_, 2.0))
答案 1 :(得分:3)
您必须将新创建的列表分配给r
,如下所示:
r = r:+ l(i)*l(i)
这是因为默认情况下,Scala中的List
是不可变的,而:+
会返回一个新列表,但不会更新旧列表。
当然,列表scala.collection.mutable.MutableList
也有可变的变体。您可以使用.++=
方法来增加集合。
val mutableList = scala.collection.mutable.MutableList(1, 2)
mutableList.++=(List(3, 4))