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) => ?
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) => ?
oops,讀取doco錯誤,map.foreach需要帶有元組參數的函數文本!
所以
m.foreach((e: (String, Int)) => println(e._1 + "=" + e._2))
工作
我不知道有關錯誤的,但你可以達到你想要的東西如下:
m.foreach(p => println(">>> key=" + p._1 + ", value=" + p._2))
也就是說,foreach
採取一對函數並返回Unit
,而不是函數t帽子需要兩個參數:這裏,p
的類型爲(String, Int)
。
另一種方式把它寫爲:
m.foreach { case (key, value) => println(">>> key=" + key + ", value=" + value) }
在這種情況下,{ case ... }
塊是一個局部函數。
這很好,更符合動態語言obj.each {K,V => ...}的做法,更比元組可讀性更強._1,._2語法 – virtualeyes 2011-12-23 14:00:26
Jut好奇,第二用法(case)有任何性能考慮嗎?對於每個元素嘗試'大小寫'他們分配給變量等。我希望我的代碼可讀,但也儘可能快。 – endertunc 2015-12-14 10:01:59
您需要對參數Tuple2
進行模式匹配,以將變量分配給其子部分key
,value
。你可以做很少的更改:
m.foreach{ case (key: String, value: Int) => println(">>> key=" + key + ", value=" + value)}
順便說一下,您可以從鍵和值中刪除類型註釋。 – Rogach 2011-12-23 05:14:42
@huitseeker我非常愛你。 – 2015-04-01 17:12:23
很好的問題! 即使明確鍵入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)}
^
混亂的錯誤消息是編譯器缺陷,這應該是fixed in 2.9.2:
使用scalac 2.9.2並且這個錯誤仍然存在。 – Renato 2013-01-14 21:53:19
我剛剛檢查過(通過編譯https://github.com/paulbutcher/baderrormessage同時針對2.9.1和2.9。 2)我可以在2.9.1中看到這個問題,而不是在2.9.2中。如果您仍然有問題的例子,那麼您應該重新打開該錯誤? – 2013-01-14 22:35:33
我剛剛使用Scala 2.9.2(Java HotSpot 1.7.0 VM for Windows 64-bit)在@(Eishay Smith)答案中發佈的代碼(我相信問題中顯示的確切問題)並可以看到他帖子中顯示的同樣荒謬的信息。 – Renato 2013-01-14 22:42:16
還有一種方法:
Map(1 -> 1, 2 -> 2).foreach(((x: Int, y: Int) => ???).tupled)
但是它需要顯式類型註解,所以我更喜歡的部分功能。
文檔說的說法是元組 - >單元,因此我們可以很容易地做到這一點
Map(1 -> 1, 2 -> 2).foreach(tuple => println(tuple._1 +" " + tuple._2)))
由於涉及的類型是推斷的,你可以簡單地做:m.foreach(e => println(e._1 +「=」+ e._2) – virtualeyes 2011-12-23 13:57:35
是否可以顯示完整的類型?有很多地圖,我很關心它是哪一個。 – 2015-09-23 07:24:20