繁体   English   中英

如何在scala中的foreach中创建一个新列表

[英]How to create a new list inside foreach in scala

我是斯卡拉的新手,只是尝试一些东西,下面是我正在尝试的东西

scala> var col  = List[String]()
col: List[String] = List()

scala> List("a", "b", "c").foreach(x => x :: col)

scala> println(col)
List()

实际上,我期待col包含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。

列表中的::方法不会向列表添加任何内容,它会创建一个带有前置值的新列表,您将丢弃此新列表,而不是将其重新分配给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]())(_ :: _)

下划线为我们提供了更短的语法来编写函数文字,我将由您决定是否更清楚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM