scala中的foreach和case语句。这个结构叫什么?

时间:2018-06-05 18:16:00

标签: scala

我有这样的方法:

def close(): Unit = {
    things.foreach {
      case (attr1, attr2) =>
        File.<do_something>(attr1, attr2)
    }
  }

这是什么结构?我知道它正在迭代所有things,这是<attr1, attr2>的地图。我可以访问这个东西吗? 如果我还想在thing的类/类型上进行模式匹配,该怎么办?我怎么能这样做?

2 个答案:

答案 0 :(得分:1)

这是一个匿名函数,它对things中的每个元素都有两个参数。

如果thingsMap[A, B],它会将File.<do_something>应用于地图中每对的键和值,假设为<do_something>&#39; s第一个参数的类型为A,第二个参数的类型为B

答案 1 :(得分:1)

foreach是一个以函数f: A => U作为参数的方法。

  @inline final override def foreach[U](f: A => U) {
    var these = this
    while (!these.isEmpty) {
      f(these.head)
      these = these.tail
    }
  }

以下示例

scala> List(1, 2, 3).foreach{elem => println(s"my elem is $elem")}
my elem is 1
my elem is 2
my elem is 3

现在,关于scala的好处是你可以在元素上进行模式匹配。 (阅读scala中的patmat

scala> List(1, "data", 3).foreach { 
         case elem: String => println(s"my elem is $elem") 
         case _ => println("something else")
       }
something else
my elem is data
something else

第二个例子是你的例子中发生了什么。您可以将每个元素与case (attr1, attr2)

匹配

例如,

scala> Map(1 -> "order 1", 2 -> "order 2", 3 -> "order 3").foreach { 
            case (key, value) => println(value)
       }
order 1
order 2
order 3

scala> List((1, "order 1"), (2, "order 2"), (3, "order 3")).foreach { 
            case (key, value) => println(value)
       }
order 1
order 2
order 3

如果没有模式匹配,你也可以这样做,

scala> Map(1 -> "order 1", 2 -> "order 2", 3 -> "order 3").foreach { 
             keyValue => println(keyValue._2)
       }
order 1
order 2
order 3