我正在尝试模拟(在我的Scala应用程序中)我的网页中显示的选项列表,并且正在摸索着为将客户端发布的String
值映射到其中而设置的解决方案&#39 ;后端的相应对象。
例如。我们假设它是Animals
的列表,用户可以选择1发布到后端。
Animals
Polar Bear
Rabbit
Great White Shark
当请求进入时,我想将 大白鲨 String
转换为Animal
,但不确定如何最好地将匹配
String
到后端的相应类型。
到目前为止,我有这个。
sealed abstract class Animal(val name: String)
case object GreatWhite extends Animal("Great White Shark")
case object PolarBear extends Animal("Polar Bear")
这允许我这样做以将UI中的字符串与我在Scala应用程序中的相应案例对象相匹配。
def matcher(animal: String) = animal match {
case GreatWhite.name => GreatWhite
case PolarBear.name => PolarBear
}
问题
如果动物列表长得很长,那么这个匹配器会非常麻烦,因为我需要为每个case
设置一个Animal
表达式。
我非常感谢任何有经验的Scala人给我一个更优雅的解决方案。
答案 0 :(得分:6)
看起来你需要的只是一个String to Animal的哈希表。 这种方法使您能够在恒定时间O(1)内获得结果,即使在扩展名列表中也是如此。
val mapping = Map[String, Animal]("Rabbit" -> Rabbit, "Polar Bear" -> PolarBear /* ... */ )
// matcher
mapping.get(animal)
UPD。 下面有一些有用的评论。
sealed abstract class Animal(val name: String)
case object GreatWhite extends Animal("Great White Shark")
case object PolarBear extends Animal("Polar Bear")
val mapping: Map[String, Animal] = Seq(GreatWhite, PolarBear).map(x => x.name -> x).toMap
mapping
答案 1 :(得分:0)
.withName
方法http://yefremov.net/blog/scala-enum-by-name/