簡體   English   中英

Scala 函數式編程 - 將類似 java 的代碼轉換為函數式代碼

[英]Scala functional programming - transform java like code to functional code

我對 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)
}
}
Future.successful(request.headers.get("user").flatMap { value =>
      val jsonObject: JsValue = Json.parse(value)
      val userOptional: Option[User] = parseResponse(jsonObject)
      userOptional
    })

從請求到User的轉換涉及三個級別的可選性(或“缺失”):

  1. "user"標題可能丟失,
  2. 標頭值可能是無效的 JSON,
  3. JSON 沒有正確的形狀可以反序列化為User

這種多級可選性可以通過 for-compehension 優雅地處理,如果在任何級別缺少某些東西,這將導致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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM