在Scala中方便地编写元组的功能

时间:2010-06-02 11:36:00

标签: scala scala-2.8

Map上的一些函数将一个键值元组的函数作为参数。例如。 def foreach(f: ((A, B)) ⇒ Unit): Unit。所以我找了一个简短的方法来写一个foreach的参数:

> val map = Map(1 -> 2, 3 -> 4)

map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4)

> map.foreach((k, v) => println(k))

error: wrong number of parameters; expected = 1
       map.foreach((k, v) => println(k))
                          ^

> map.foreach({(k, v) => println(k)})

error: wrong number of parameters; expected = 1
       map.foreach({(k, v) => println(k)})
                           ^

> map.foreach(case (k, v) => println(k))

error: illegal start of simple expression
       map.foreach(case (k, v) => println(k))
                   ^

我能做到

> map.foreach(_ match {case (k, v) => println(k)})

1
3

有更好的选择吗?

6 个答案:

答案 0 :(得分:46)

你与map.foreach(case (k, v) => println(k))非常接近。要在匿名函数中使用case,请用大括号括起来。

map foreach { case (k, v) => println(k) }

答案 1 :(得分:13)

在这种情况下,我经常使用for语法。

for ((k,v) <- map) println(k)

根据“Scala编程”第23章,上面的for循环被转换为call foreach

答案 2 :(得分:5)

另一种选择是tupled对象的Function方法:

import Function.tupled;
// map tupled foreach {(k, v) => println(k)}
map foreach tupled {(k, v) => println(k)}

答案 3 :(得分:3)

您还可以按如下方式访问元组:


scala> val map = Map(1 -> 2, 3 -> 4)
map: scala.collection.immutable.Map[Int,Int] = Map((1,2), (3,4))
scala> map foreach (t => println(t._1))
1
3

答案 4 :(得分:2)

Welcome to Scala version 2.8.0.Beta1-prerelease (OpenJDK Server VM, Java 1.6.0_0).
Type in expressions to have them evaluated.
Type :help for more information.

scala> val m = Map('a -> 'b, 'c -> 'd)
m: scala.collection.immutable.Map[Symbol,Symbol] = Map('a -> 'b, 'c -> 'd)

scala> m foreach { case(k, v) => println(k) }
'a
'c

答案 5 :(得分:1)

我最后的尝试非常接近,实际上是:

> map.foreach({case (k, v) => println(k)})
1
3