【问题标题】:foreach loop in scalascala中的foreach循环
【发布时间】:2017-12-23 05:17:19
【问题描述】:

如果我有列表,则在 scala foreach 循环中

val a = List("a","b","c","d")

我可以在没有这样的模式匹配的情况下打印它们

a.foreach(c => println(c))

但是,如果我有这样的元组

val v = Vector((1,9), (2,8), (3,7), (4,6), (5,5))

我为什么要使用

v.foreach{ case(i,j) => println(i, j) }
  1. 模式匹配案例
  2. {括号

请解释执行两个 foreach 循环时会发生什么。

【问题讨论】:

  • 这是 scala 的设计缺陷。这可能是有解释的,但它会很长而且主要是无用的。
  • 根据 Scala 3 中的 Dotty 团队,这将是有效的:v.foreach((i,j) => println(i, j))

标签: scala foreach


【解决方案1】:

您不必这样做,您可以选择。问题是当前的Scala编译器不解构元组,你可以这样做:

v.foreach(tup => println(tup._1, tup._2))

但是,如果您希望能够使用一个新的变量名称来引用它自己的每个元素,您必须求助于具有模式匹配的部分函数,​​它可以解构元组。

当你像这样使用case 时,编译器会这样做:

def main(args: Array[String]): Unit = {
  val v: List[(Int, Int)] = scala.collection.immutable.List.apply[(Int, Int)](scala.Tuple2.apply[Int, Int](1, 2), scala.Tuple2.apply[Int, Int](2, 3));
  v.foreach[Unit](((x0$1: (Int, Int)) => x0$1 match {
    case (_1: Int, _2: Int)(Int, Int)((i @ _), (j @ _)) => scala.Predef.println(scala.Tuple2.apply[Int, Int](i, j))
  }))
}

您会看到它在未命名的x0$1 上进行模式匹配,并将_1_2 分别放在ij 中。

【讨论】:

    【解决方案2】:

    根据http://alvinalexander.com/scala/iterating-scala-lists-foreach-for-comprehension

    val names = Vector("Bob", "Fred", "Joe", "Julia", "Kim")
    
    for (name <- names)
        println(name)
    

    【讨论】:

      【解决方案3】:

      回答#2:您只能在大括号中使用case。关于大括号的更完整答案位于here

      【讨论】:

        【解决方案4】:

        Vector 的工作方式有点不同,您使用的是函数字面量,使用 case...

        在 Scala 中,我们使用括号{} 接受case...

        {
          case pattern1 => "xxx"
          case pattern2 => "yyy"
        }
        

        所以,在这种情况下,我们将它与 foreach 循环一起使用...

        然后使用以下模式打印所有值:

        val nums = Vector((1,9), (2,8), (3,7), (4,6), (5,5))
        
        nums.foreach {
            case(key, value) => println(s"key: $key, value: $value")
        }
        

        如果你认为这不是你喜欢的东西,你也可以检查其他循环,比如 for 循环......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-05-28
          • 2020-02-28
          • 1970-01-01
          • 2016-09-26
          • 2012-07-19
          • 2013-10-01
          相关资源
          最近更新 更多