Scala映射foreach

Scala映射foreach,scala,scala-collections,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)

鉴于:

为什么编译器会抱怨

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) => ?
也就是说,
foreach
接受一个接受一对并返回
Unit
的函数,而不是接受两个参数的函数:这里,
p
具有类型
(String,Int)

另一种书写方式是:

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

在这种情况下,
{case…}
块是一个部分函数。

您需要在
Tuple2
参数上进行模式匹配,以将变量分配给其子部分
。您只需进行很少的更改:

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

哎呀,读错文档了,map.foreach需要一个带有元组参数的函数文本

所以

作品

好问题! 即使显式地键入foreach方法,它仍然会给出非常不清楚的编译错误。有很多方法可以解决这个问题,但我不明白为什么这个例子不起作用

m.foreach((e: (String, Int)) => println(e._1 + "=" + e._2))
scala>m.foreach[Unit]{(key:String,value:Int)=>println(“>>>key=“+key+”,value=“+value”)}
:16:错误:类型不匹配;
找到:(字符串,Int)=>单位
必需:(字符串,Int)=>单位
m、 foreach[Unit]{(key:String,value:Int)=>println(“>>>key=“+key+”,value=“+value”)}
^

令人困惑的错误消息是一个编译器错误,应该是:

另一种方式:

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)}
                                                         ^

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

文档说参数是tuple->unit,所以我们可以很容易地做到这一点

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

顺便说一下,您可以从key和value中删除类型注释。考虑到所涉及的类型是推断的,您可以简单地执行:m.foreach(e=>println(e.。_1+“=”+e.。_2)是否可以显示完整的类型?有很多映射,我关心它是哪一个。这很好,更符合动态语言obj。每个{k,v=>…}方法和可读性比元组更高。_1,。_2syntaxjuts奇怪的是,第二次使用(case)是否有任何性能考虑?对于每个元素,尝试将它们“case”分配给变量等。我希望我的代码可读,但也要尽可能快。我刚刚检查过(根据2.9.1和2.9.2进行编译)。我可以在2.9.1中看到问题,但在2.9.2中看不到问题。如果您有问题仍然存在的示例,也许您应该重新打开该错误?我刚刚尝试了下面@(Eishay Smith)在答案中发布的代码(我相信与问题中显示的问题完全相同)和Scala 2.9.2(适用于Windows 64位的Java HotSpot 1.7.0 VM)我从Git编译代码时会发生这样的情况:欢迎使用Scala 2.9.2版(Java HotSpot(TM)64位服务器虚拟机,Java 1.7.0)。键入表达式进行计算。键入:帮助以获取更多信息。Scala>class Foo扩展函数2[Int,Int,Int]{def apply(x:Int,y:Int)=x+y |覆盖定义元组:(Int,Int)=>Int=super.tuple |}:9:错误:类型不匹配;找到:((Int,Int))=>Int必需:(Int,Int)=>Int覆盖定义元组:(Int,Int)=>Int=super.tupled^错误消息是正确的。请注意,“找到”行中有两组括号。错误在于它仅用于打印一组括号。如果在2.9.1中尝试并区分输出,您将看到它们不同。
Map(1 -> 1, 2 -> 2).foreach(((x: Int, y: Int) => ???).tupled)
Map(1 -> 1, 2 -> 2).foreach(tuple => println(tuple._1 +" " + tuple._2)))