创建一个新的列表内的foreach我新手,Scala和只是想出来的东西,下面是我试图如何在斯卡拉
scala> var col = List[String]()
col: List[String] = List()
scala> List("a", "b", "c").foreach(x => x :: col)
scala> println(col)
List()
其实,我期待山坳包含A,B,C ,我错过了什么?
创建一个新的列表内的foreach我新手,Scala和只是想出来的东西,下面是我试图如何在斯卡拉
scala> var col = List[String]()
col: List[String] = List()
scala> List("a", "b", "c").foreach(x => x :: col)
scala> println(col)
List()
其实,我期待山坳包含A,B,C ,我错过了什么?
您需要在foreach
scala> var col = List[String]()
col: List[String] = List()
scala> List("a", "b", "c").foreach(x => {col = x :: col})
scala> col
res0: List[String] = List(c, b, a)
操作x :: col
简单地返回由前置到col
元素x
的一个新的列表中的任务,原来col
不会改变。您需要重新分配col
到这个新生成的列表。
但是请注意,由于您使用的是副作用,因此通常不会被认为是惯用的Scala。
谢谢@ evan058,现在我的示例中的空列表对我来说是有意义的! – samadhi000
@ samadhi000没问题。就像一个供参考,[upvotes是SO的感谢货币](http://stackoverflow.com/help/someone-answers)。您可以提出多个您认为有用的答案(但您只能接受一个,您为我的帖子所做的答案)。 –
我想看起来像我甚至没有特权 – samadhi000
的::
方法在列表不添加到列表中任何东西,它创建了前面加上它的价值一个新的列表,你是放弃重新分配给col
的这个新的列表来代替。 x => col = x :: col
会将您列表中的每个元素添加到col
。请注意,col
将为List(“c”,“b”,“a”),因为您预先等待col
的元素,所以订单被撤销。
请注意,foreach
什么也没有返回,并且设计用于副作用操作。如果您只是想要转换集合或将元素加载到另一个集合中,则有更好的方法可供使用。
对于您的具体操作,最合适的方法是foldRight
,它以从右到左的相反顺序迭代元素。我们希望在这里反向迭代,因为当您将元素预先添加到列表中时,订单会颠倒过来。
val col = List("a", "b", "c").foldRight(List[String]())((x, acc) => x :: acc)
将产生List("a", "b", "c")
。这具有以下优点:我们不再需要使用var
来声明可变变量,事实上,我们不需要' 需要提前声明我们的列表。
音符,我们可以使用一些特殊的语法来节省一些打字
val col = List("a", "b", "c").foldRight(List[String]())(_ :: _)
的下划线给我们一个更短的语法来写函数文本,我将离开你来决定它是否更是否清楚。
感谢@puhlen的详细解释! – samadhi000
我真的想投票,但不幸的是我没有选择这样做 – samadhi000
将元素预先添加到列表不会修改列表。 – Jubobs
我明白了,那么在这种情况下如何修改列表? – samadhi000