scala中的foreach循环

时间:2017-07-18 11:08:58

标签: scala foreach

如果我有列表

,则在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. {bracket
  3. 请解释执行两个foreach循环时会发生什么。

4 个答案:

答案 0 :(得分:5)

你不必,你选择。问题是当前的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内。

答案 1 :(得分:3)

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

val names = Vector("Bob", "Fred", "Joe", "Julia", "Kim")

for (name <- names)
    println(name)

答案 2 :(得分:1)

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

答案 3 :(得分:0)

向量的工作方式略有不同,您使用带有大小写的函数字面量...

在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循环...