Scala функциональное программирование - преобразование java кода в функциональный код - PullRequest
1 голос
/ 09 марта 2020

Я немного новичок в Scala Я пытаюсь преобразовать блок кода, начиная с if ... который выглядит как Java, во что-то более похожее на Scala (я думаю, плоская карта или случай), но Я не смог создать правильный результат для функции. Любые идеи? Спасибо

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)
}
}

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Преобразование из запроса в 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 из логики c, поскольку это преобразование не имеет ничего общего с асинхронными вызовами.

Затем можно реализовать метод getSubject, вызвав приведенную выше функцию:

override def getSubject[A](request: AuthenticatedRequest[A]): Future[Option[Subject]] =
  Future.successful(userFromRequest(request))
1 голос
/ 09 марта 2020
Future.successful(request.headers.get("user").flatMap { value =>
      val jsonObject: JsValue = Json.parse(value)
      val userOptional: Option[User] = parseResponse(jsonObject)
      userOptional
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...