Scala函数式编程-将类java代码转换为函数式代码
我对Scala有点陌生 我正在尝试转换代码块,从if开始。。。它看起来更像Java,更像Scala(我认为是flatmap或case),但我无法为函数创建正确的结果。 有什么想法吗? 谢谢Scala函数式编程-将类java代码转换为函数式代码,scala,Scala,我对Scala有点陌生 我正在尝试转换代码块,从if开始。。。它看起来更像Java,更像Scala(我认为是flatmap或case),但我无法为函数创建正确的结果。 有什么想法吗? 谢谢 从请求到用户的转换涉及三个级别的可选性(或“缺失”): “user”标题可能丢失 标头值可能是无效的JSON JSON无法将正确的形状反序列化为用户 这种多级可选性可以通过for compehension优雅地处理,如果任何级别缺少某些内容,则会导致None,如果一切正常,则会导致Some(user): de
从请求到用户的转换涉及三个级别的可选性(或“缺失”):
“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
如果这段代码没有问题,那么使用它是完全可以的?为什么您希望用例用于一个微不足道的匹配?使用match case代替if和else不是sacla的方法,或者如果你在scala库中看到,它们有很多if和else,只是你需要正确的纯函数。这是游戏吗?如果是这样,有一件事要记住,不幸的是,这个游戏是以一种非常面向对象的方式设计的。如果您想实现纯粹的功能性,您可能需要切换到类似http4s的东西。为了使它更“scala”,请查看是否可以让
包含
返回一个选项
Future.successful(request.headers.get("user").flatMap { value =>
val jsonObject: JsValue = Json.parse(value)
val userOptional: Option[User] = parseResponse(jsonObject)
userOptional
})
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
override def getSubject[A](request: AuthenticatedRequest[A]): Future[Option[Subject]] =
Future.successful(userFromRequest(request))