Scala 中的 foreach 和 case 语句放在一起。这个结构叫什么?

Jwa*_*622 3 scala

我有一个这样的方法:

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

这是一种什么样的结构?我知道它正在遍历所有things地图 if <attr1, attr2>。我可以访问事物本身吗?如果我还想对thing. 我怎样才能做到这一点?

pra*_*upd 7

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
    }
  }
Run Code Online (Sandbox Code Playgroud)

下面的例子

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
Run Code Online (Sandbox Code Playgroud)

现在,Scala 的好处是你可以根据元素的值“模式匹配”。把它想象成if else但也有解构你的输入的能力。(阅读编程中的 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
Run Code Online (Sandbox Code Playgroud)

第二个例子是你的例子中发生了什么。您正在将每个元素模式匹配到case (attr1, attr2),这意味着每个元素都被解构为(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
Run Code Online (Sandbox Code Playgroud)

没有“模式匹配”,你可以简单地提供一个功能,

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