Foreach vs Scala中的地图

时间:2017-05-18 08:32:58

标签: scala

我尝试了两种方法来制作一个列表

var response = List[RS_TxnNested]
consumertxnlist.foreach(txData => {
  response = RS_TxnNested(blabla) +: response
})

其中consumertxnlist是Seq [something]。

另一种方式是

var response = consumerTxnList._2.map(txData => RS_TxnNested(blabla))

有人可以帮我澄清哪一个更好,为什么?

5 个答案:

答案 0 :(得分:5)

正如您已经注意到的那样,Seq trait中的map函数返回一个值。它的签名实际上是

def map[B](f: (A) ⇒ B): Seq[B]

它旨在将函数应用于扩展Seq特征的集合的每个元素并返回一个新集合。

另一方面,foreach在同一特征中具有以下特征:

def foreach(f: (A) ⇒ Unit): Unit

这意味着它设计用于执行具有副作用的功能。

在您的示例中,您正在处理将值分配给"响应"作为副作用。如果您的实际目标是返回一个值(就像您想要的那样),那么请使用map。

答案 1 :(得分:2)

1)使用forEach和元素的前置将产生一个List,其元素的顺序相反。

2)使用forEach时,您必须将响应定义为var,而使用map时,您可以将响应定义为val。

我建议使用地图,因为它更符合你的意图。

答案 2 :(得分:1)

使用foreach返回单位(无),如果你正在做副作用或类似的东西,可以使用它。

如果要返回数据,则应使用map,flatMap,fold等内容。

scala> val l: List[String] = List("a", "b", "c")
l: List[String] = List(a, b, c)

scala> l.map(e => e.toUpperCase(java.util.Locale.ROOT))
res0: List[String] = List(A, B, C)

scala> l.foreach(e => println(e))
a
b
c

答案 3 :(得分:1)

第二个版本更明确。

map传达了改造某事的意义,这正是你正在做的事情。

foreach代替对其范围之外的事情执行操作,但不是很清楚。

换句话说,当我阅读foreach时,我必须查看整个范围,因为我知道您将执行副作用(因为foreach会返回Unit

当我阅读map时,我可以自信地假设所涉及的唯一表达方式是我目前正在关注的那个。

map降低了读者的负担,使代码更易于推理。

答案 4 :(得分:1)

如果你想从循环操作中返回对象,我认为你应该避免forEach。而是选择foldLeft或其他类型的折叠操作。就你的问题而言,如果你要回复,那么你应该再次使用地图,因为每个都应该正常工作。