Scala地图foreach
给定:
val m = Map[String, Int]("a" -> 1, "b" -> 2, "c" -> 3) m.foreach((key: String, value: Int) => println(">>> key=" + key + ", value=" + value)) 为什么编译器会抱怨?
 error: type mismatch found : (String, Int) => Unit required: (String, Int) => ? 
	
我不知道这个错误,但你可以达到你想要的,如下所示:
 m.foreach(p => println(">>> key=" + p._1 + ", value=" + p._2)) 
 也就是说, foreach需要一个函数,它接受一对并返回Unit ,而不是一个带有两个参数的函数:在这里, p有type (String, Int) 。 
另一种写法是:
 m.foreach { case (key, value) => println(">>> key=" + key + ", value=" + value) } 
 在这种情况下, { case ... }块是一个部分函数。 
哎呀,阅读错误的DOCO,map.foreach需要一个函数文字与元组参数!
所以
 m.foreach((e: (String, Int)) => println(e._1 + "=" + e._2)) 
作品
令人困惑的错误消息是一个编译器错误,应该在2.9.2中修复 :
 您需要对Tuple2参数进行模式匹配,以将variables分配给其子部件key 。 你可以做很less的改变: 
 m.foreach{ case (key: String, value: Int) => println(">>> key=" + key + ", value=" + value)} 
很好的问题! 即使明确键入foreach方法,它仍然给出了非常不清楚的编译错误。 有办法,但我不明白为什么这个例子不起作用。
 scala> m.foreach[Unit] {(key: String, value: Int) => println(">>> key=" + key + ", value=" + value)} <console>:16: error: type mismatch; found : (String, Int) => Unit required: (String, Int) => Unit m.foreach[Unit] {(key: String, value: Int) => println(">>> key=" + key + ", value=" + value)} ^ 
文档说参数是元组 – >单元,所以我们可以很容易地做到这一点
 Map(1 -> 1, 2 -> 2).foreach(tuple => println(tuple._1 +" " + tuple._2))) 
另一种方式:
 Map(1 -> 1, 2 -> 2).foreach(((x: Int, y: Int) => ???).tupled) 
但是它需要明确的types注释,所以我更喜欢部分函数。