【问题标题】:Foreach vs Map in Scala [duplicate]Scala中的Foreach与Map [重复]
【发布时间】:2017-10-17 23:05:05
【问题描述】:

我尝试了两种方法来列出一些东西

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))

谁能帮我澄清一下哪个更好,为什么?

【问题讨论】:

标签: scala


【解决方案1】:

使用 foreach 返回 Unit(无),如果您正在做副作用或类似的事情,可以使用它。

如果你想返回数据,那么你应该使用 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

【讨论】:

  • 感谢您的回答...但在我的情况下我很困惑..我正在使用 Seq 的元素在 foreach 循环中创建一个列表,但另一方面我没有对元素本身(不对Seq的元素进行任何操作)
  • 为什么要重新创建一个列表?如果您只需要另一种列表类型,您可以尝试.to... 运算符(toList、toSeq、to[T])。
【解决方案2】:

第二个版本的作用更加明确。

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

foreach 反而在其范围之外执行操作,这不是很清楚。

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

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

map 减轻了读者的负担,并使代码更容易推理。

【讨论】:

    【解决方案3】:

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

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

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

    另一方面,foreach 具有相同的特征,具有以下签名:

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

    这意味着它旨在执行具有副作用的功能。

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

    【讨论】:

    • 我的目标只是使用 Seq 元素制作一个列表(响应)。它不像我想返回一个值。
    • “使用 Seq 元素制作一个列表(响应)”是“返回一个值”:)
    【解决方案4】:

    如果您想从循环操作中返回对象,我认为您应该避免使用 forEach。而是去 foldLeft 或其他类型的折叠操作。就您的问题而言,如果您再次返回响应,那么您应该使用 map else forEach 应该可以正常工作。

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-26
        • 2010-12-17
        • 2021-09-30
        • 2013-06-09
        • 2018-04-10
        • 2014-11-03
        • 1970-01-01
        • 2020-03-27
        • 2016-11-05
        相关资源
        最近更新 更多