斯卡拉地图foreach

时间:2011-12-22 23:17:19

标签: scala scala-collections

下式给出:

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) => ?

7 个答案:

答案 0 :(得分:74)

我不确定错误,但您可以按照以下方式实现您想要的目标:

m.foreach(p => println(">>> key=" + p._1 + ", value=" + p._2))

也就是说,foreach接受一对函数并返回Unit,而不是一个带有两个参数的函数:此处,p的类型为(String, Int)。< / p>

另一种写作方式是:

m.foreach { case (key, value) => println(">>> key=" + key + ", value=" + value) }

在这种情况下,{ case ... }块是部分功能。

答案 1 :(得分:28)

oops,读取doco错误,map.foreach期望一个带有元组参数的函数文字!

所以

m.foreach((e: (String, Int)) => println(e._1 + "=" + e._2))

作品

答案 2 :(得分:15)

您需要对Tuple2参数进行模式匹配,以将变量分配给其子部分keyvalue。你可以做很少的改变:

m.foreach{ case (key: String, value: Int) => println(">>> key=" + key + ", value=" + value)} 

答案 3 :(得分:14)

令人困惑的错误消息是编译器错误,应该是fixed in 2.9.2

答案 4 :(得分:5)

很棒的问题! 即使明确键入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)}
                                                         ^

答案 5 :(得分:1)

Docs说论证是元组 - &gt;单位,所以我们可以很容易地做到这一点

Map(1 -> 1, 2 -> 2).foreach(tuple => println(tuple._1 +" " + tuple._2)))

答案 6 :(得分:0)

另一种方式:

Map(1 -> 1, 2 -> 2).foreach(((x: Int, y: Int) => ???).tupled)

然而,它需要显式类型注释,所以我更喜欢部分函数。