scala - 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)
}
}
解决方案
从请求到转换User
涉及三个级别的可选性(或“缺失”):
- 标题
"user"
可能丢失, - 标头值可能是无效的 JSON,
- 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))
推荐阅读
- c# - 在函数的参数中传递 WebElements 列表并使用 selenium c# 代码循环它
- azure - Azure 资源管理器资源组部署
- git - 创建 github 操作,但仅将其保存在私人仓库中
- javascript - 内部带有猫鼬保存的递归异步函数
- sql - SQL 标识函数
- angular - Angular 10 , BehaviorSubject 返回两个值
- powershell - 从 Powershell 读取和上传 zip 文件
- if-statement - 如何将英语语句更改为一阶逻辑
- javascript - 从父级访问子状态
- facebook - Facebook 页面访问令牌列表发布所有评论但不显示未知用户名和 ID