![](/img/trans.png)
[英]how would you transform this functional java code to scala above SparkContext?
[英]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
的轉換涉及三個級別的可選性(或“缺失”):
"user"
標題可能丟失,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.