首页 > 解决方案 > Scala 函数式编程 - 将类似 java 的代码转换为函数式代码

问题描述

我对 Scala 有点陌生 我正在尝试将代码块从 if...功能。有任何想法吗?谢谢

override def getSubject[A](request: AuthenticatedRequest[A]): Future[Option[Subject]] = {
def parseResponse(body: JsValue): Option[User] = body.asOpt[User]

if(request.headers.keys.contains("user")) {
  val jsonObject: JsValue = Json.parse(request.headers.get("user").get)
  val userOptional: Option[User] = parseResponse(jsonObject)
  Future.successful(userOptional)
} else {
  Future.successful(None)
}
}

标签: scala

解决方案


从请求到转换User涉及三个级别的可选性(或“缺失”):

  1. 标题"user"可能丢失,
  2. 标头值可能是无效的 JSON,
  3. JSON 无法具有正确的形状来反序列化为User.

这种多层次的可选性可以通过综合处理来优雅地处理,这将导致在None任何层次上是否缺少某些东西,并且Some(user)如果一切都很好:

def userFromRequest(request: AuthenticatedRequest[A]): Option[User] =
  for {
    userHeader <- request.headers.get("user")  // "user" header may be missing 
    userJson   <- Json.parseOpt(userHeader)    // header value may be not valid json
    user       <- userJson.asOpt[User]         // json may be not convertible to user
  } yield user

请注意,我已经从逻辑中取出了Future,因为这种转换与异步调用无关。

然后,您可以getSubject通过调用上面的函数来实现该方法:

override def getSubject[A](request: AuthenticatedRequest[A]): Future[Option[Subject]] =
  Future.successful(userFromRequest(request))

推荐阅读