我尝试了两种方法来制作一个列表
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))
有人可以帮我澄清哪一个更好,为什么?
答案 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或其他类型的折叠操作。就你的问题而言,如果你要回复,那么你应该再次使用地图,因为每个都应该正常工作。