关于案例类/对象/匹配的建议

时间:2016-05-05 09:17:31

标签: scala

我正在尝试模拟(在我的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人给我一个更优雅的解决方案。

2 个答案:

答案 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)

你看过Enums了吗?如果它们可供您使用,则枚举会使用.withName方法http://yefremov.net/blog/scala-enum-by-name/