2016-03-30 65 views
2

我需要在scala中声明一个常量映射,并且指定什么才是正确的方法。 Java的方式是斯卡拉风格:恒定的地图与模式匹配

private static final String[] numbers = {"zero","one","two","three"} //Java 
val numbers = Array("zero","one","two","three") //Scala 
val numbers = collection.immutable.HashMap(0 -> "zero", 1 -> "one", 2 => "two") //Scala maps 

另一种方法是,在Scala是

def array(i: Int) = i match { 
    case 0 => "zero" 
    case 1 => "one" 
    case 2 => "two" 
} 

是否有一个标准的/推荐的方式做到这一点在Scala呢?

回答

1

不是。这取决于目的。下面是生成密钥的版本:

List("zero", "one", "two", "three").zipWithIndex.map(_.swap).toMap 

(仍然是一个地图,假设你可以使用索引)

我已经看到了这两种方法,根据使用的环境。

如果您需要序列化映射或传递它或保留它的不同版本,地图会更好。

否则,模式匹配可能会更好。

+0

你的代码以另一种方式生成Map(String-> Int)。 OP希望Int-> String。 –

+0

@TheArchetypalPaul你是对的,我错过了。我更新了代码以纠正错误。 –

2

Map提供了普通函数不提供的功能。例如,您可以枚举/扫描/遍历/过滤现有的键和值。地图/缩小/转换等(你可以有一个默认值或者在丢失的键上也产生一个错误,尽管其他答案建议)。

如果您不需要这些,那么没有太大的区别......除非条目数量相当大,否则访问Map通常会比评估静态模式更快。