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

Scala 关于案例类别/对象/匹配的建议,scala,Scala,我试图(在我的Scala应用程序中)为我的网页中显示的选项列表建模,我绞尽脑汁想出了一个解决方案,用于将从客户端发布的字符串值映射到后端对应的对象 Animals Polar Bear Rabbit Great White Shark 比如说,这是一个动物的列表,用户可以选择1发布到后端 Animals Polar Bear Rabbit Great White Shark 当收到请求时,我想将大白鲨字符串转换为动物,但不确定如何最好地匹配 字符串到后端中

我试图(在我的Scala应用程序中)为我的网页中显示的选项列表建模,我绞尽脑汁想出了一个解决方案,用于将从客户端发布的
字符串
值映射到后端对应的对象

Animals
   Polar Bear
   Rabbit
   Great White Shark
比如说,这是一个
动物的列表,用户可以选择1发布到后端

Animals
   Polar Bear
   Rabbit
   Great White Shark
当收到请求时,我想将大白鲨
字符串
转换为
动物
,但不确定如何最好地匹配
字符串
到后端中的相应类型

Animals
   Polar Bear
   Rabbit
   Great White Shark
到目前为止,我有这个

sealed abstract class Animal(val name: String)

case object GreatWhite extends Animal("Great White Shark")
case object PolarBear extends Animal("Polar Bear")
这使我能够将UI中的字符串与Scala应用程序中相应的case对象进行匹配

def matcher(animal: String) = animal match {
    case GreatWhite.name => GreatWhite
    case PolarBear.name => PolarBear
}
问题

但是,如果动物的列表越来越长,那么这个匹配器将非常麻烦,因为我需要为每个
动物
使用
大小写
表达式


我非常感谢任何有经验的Scala人员为我提供一个更优雅的解决方案。

看起来你需要的只是一个字符串哈希表。 这种方法使您能够在常数时间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

你看过Enum吗?如果它们对您可用,Enum有一个
。withName
方法

您使用哪个框架进行客户端-后端通信?如果接口是RESTful API,那么它就是一个带有JSON主体的帖子。可能是play/spray?@Yuval,我目前正在使用play进行后端通信(可能会改用Spray,因为我认为如果你不需要Scala模板等,它会更轻一些)。前端是一个余烬应用程序。次要说明:Spray已经停用了一段时间,模块取代了它-我认为它是由原作者开发的为了避免拼写错误,可以使用
Rabbit.name->Rabbit,PolarBear.name->PolarBear
而不是复制的字符串文本。有没有方法执行
getAllSealedClassObjects.map(u.name->name)
?谢谢-我喜欢这个,也谢谢你的O符号说明。我可以这么说,但在我将其标记为答案之前,让我看看还有什么其他解决方案。@Thilo看起来像是:Seq(GreatWhite,PolarBear)。map(x=>x.name->x)