在Scala中编写此函数的更多功能和简洁方法

时间:2013-07-13 18:41:39

标签: scala

我从这开始(在Play Action方法中):

    val foo = JPA.em.find(classOf[Foo], id)
    if (foo == null) NotFound("Bad Id") else Ok(Json.toJson(foo))

不喜欢它的命令性,我去了这个:

    Option(JPA.em.find(classOf[Foo], id)) match {
      case Some(foo) => Ok(Json.toJson(foo))
      case None => NotFound("Bad Id")
    }

功能更强,但更长。

我为这个问题的一般性质道歉,但我敢打赌答案可能会对很多人有所帮助。

2 个答案:

答案 0 :(得分:4)

Option(JPA.em.find(classOf[Foo], id)).map(foo=>Ok(Json.toJson(foo))).getOrElse(NotFound("Bad Id"))

答案 1 :(得分:1)

使用一些返回Option的可重用方法来包装不安全的Java API绝对是值得的,例如

def findOpt[T](cls: Class[T], id: Object): Option[T] =
  Option(JPA.em.find(cls, id))

使用此API,而不是直接使用JPA,意味着您无需担心代码中其他位置的空检查。这一切都在一个地方处理。

现在,您可以决定是使用matchfold还是map / getOrElse;重要的是,findOpt的类型可以表示可能缺少结果。

findOpt(classOf[Foo], id) map (foo => OK(Json.toJson(foo)) getOrElse NotFound("Bad Id")