Scala函数式编程-将类java代码转换为函数式代码

Scala函数式编程-将类java代码转换为函数式代码,scala,Scala,我对Scala有点陌生 我正在尝试转换代码块,从if开始。。。它看起来更像Java,更像Scala(我认为是flatmap或case),但我无法为函数创建正确的结果。 有什么想法吗? 谢谢 从请求到用户的转换涉及三个级别的可选性(或“缺失”): “user”标题可能丢失 标头值可能是无效的JSON JSON无法将正确的形状反序列化为用户 这种多级可选性可以通过for compehension优雅地处理,如果任何级别缺少某些内容,则会导致None,如果一切正常,则会导致Some(user): de

我对Scala有点陌生 我正在尝试转换代码块,从if开始。。。它看起来更像Java,更像Scala(我认为是flatmap或case),但我无法为函数创建正确的结果。 有什么想法吗? 谢谢


从请求到用户的转换涉及三个级别的可选性(或“缺失”):

  • “user”
    标题可能丢失
  • 标头值可能是无效的JSON
  • JSON无法将正确的形状反序列化为
    用户
  • 这种多级可选性可以通过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
    

    如果这段代码没有问题,那么使用它是完全可以的?为什么您希望用例用于一个微不足道的匹配?使用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))