2010-02-06 38 views
11

非常方便Ruby代码:Scala相当于Ruby的map.each?

some_map.each do |key,value| 
    # do something with key or value 
end 

斯卡拉相当于:

someMap.foreach(entry => { 
    val (key,value) = entry 
    // do something with key or value 
}) 

不必增加额外val线我的错误。我无法弄清楚如何声明函数arg来提取元组,所以我想知道有没有办法做到这一点,或为什么没有foreach提取我的键和值?

回答

19

这工作,也:

someMap.foreach {case (key, value) => 
    // do something with key and/or value 
} 
+0

case语句实际上是一个伪装的部分函数,​​这就是为什么这个方便的分解速记正常工作。这可能有助于那些由于这种表达不匹配导致的类型错误迷惑的人。 –

+0

关于部分函数的好文章http://ebruchez.blogspot.com/2011/10/scala-partial-functions-without-phd.html – foolshat

11

我喜欢这一个:

scala> val foo = Map(1 -> "goo", 2 -> "boo") 
foo: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> goo, 2 -> boo) 

scala> for ((k,v) <- foo) println(k + " " + v) 
1 goo 
2 boo 
+0

'for'生成器内不需要'val'。 –

5

你不需要即使在for循环val

继ViktorKlang的例子:

scala> val foo = Map(1 -> "goo", 2 -> "boo") 
foo: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> goo, 2 -> boo) 

scala> for ((k, v) <- foo) println(k + " " + v) 
1 goo 
2 boo 

需要注意的是for是Scala相当强大,所以你也可以用它来sequence comprehensions

scala> val bar = for (val (k, v) <- foo) yield k 
bar: Iterable[Int] = ArrayBuffer(1, 2) 
+0

'for'实际上是一个伪装成'for'循环的Monad Comprehension,所以不会用诸如* Monad *的概念吓跑Java程序员。 (就像查询在C#/ VB.NET中的理解一样,monad理解为SQL查询)。所以它比序列理解更强大。 –

+1

Jörg,不要用M字,它吓人;-) –

+0

@ViktorKlang:的确!这就是为什么Martin Odersky将它们伪装成Java程序员已经知道的东西:for循环。 Erik Meijer将它们伪装成C#和VB.NET中的SQL查询,Don Syme将它们伪装成F#中的Unix shell管道,Simon Peyton Jones将它们伪装成Haskell中的C块。 (有时候我认为如果他们不是经常躲在阴影里,他们会*少*吓人) –

2

Function.tupled功能(a1, a2) => b)转换为功能((a1, a2)) => b

import Function._ 
someMap foreach tupled((key, value) => printf("%s ==> %s\n", key, value))