2017-02-09 53 views
2

创建一个新的列表内的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 ,我错过了什么?

+0

将元素预先添加到列表不会修改列表。 – Jubobs

+0

我明白了,那么在这种情况下如何修改列表? – samadhi000

回答

3

您需要在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。

+0

谢谢@ evan058,现在我的示例中的空列表对我来说是有意义的! – samadhi000

+0

@ samadhi000没问题。就像一个供参考,[upvotes是SO的感谢货币](http://stackoverflow.com/help/someone-answers)。您可以提出多个您认为有用的答案(但您只能接受一个,您为我的帖子所做的答案)。 –

+0

我想看起来像我甚至没有特权 – samadhi000

4

::方法在列表不添加到列表中任何东西,它创建了前面加上它的价值一个新的列表,你是放弃重新分配给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]())(_ :: _)

的下划线给我们一个更短的语法来写函数文本,我将离开你来决定它是否更是否清楚。

+0

感谢@puhlen的详细解释! – samadhi000

+0

我真的想投票,但不幸的是我没有选择这样做 – samadhi000