Map容器​​中函数的紧凑表示法?

时间:2012-03-26 10:17:05

标签: function scala collections

我正在为对象中的简单数据访问器构建枚举条目的映射。以下是使用Int作为密钥的示例(来自解释器):

class Obj(a: Int, b: Int) {
    def getA = a
    def getB = b
}

val m : Map[Int, (Obj) => Int] = Map(
    (2, (o: Obj) => o.getA)
);

val d = m(2)(new Obj(3,4))

这很好用,但是必须在每个map值的参数中明确地写一个带有:Obj类型的函数:

(o: Obj) => o.getA

我缺少更严格的语法吗?

2 个答案:

答案 0 :(得分:6)

在这种情况下,将推断出类型,例如:

scala> val m : Map[Int, (Obj) => Int] = Map(
     |     (2, _.getA)
     | )
m: Map[Int,Obj => Int] = Map(2 -> <function1>)

scala> m(2)( new Obj(3,4) )
res0: Int = 3

这里我使用下划线使函数定义尽可能简洁,但您也可以将函数定义为:o => o.getA。如果参数被多次使用会很有用,例如:o => o.getA + o.getB

答案 1 :(得分:3)

如果你想要摆脱左侧的类型注释(并不总是一个好主意,但有益于简洁),你可以保持原来的右手边或略短:

val m = Map( (2, (_: Obj).getA) )

另外,在Scala中,将类定义为

更为惯用
class Obj(val a: Int, val b: Int)
// or
case class Obj(a: Int, b: Int)

并简单地将您的字段称为ab,因为编译器会为您提供getter。