加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala用于理解期货和期权

发布时间:2020-12-16 18:39:47 所属栏目:安全 来源:网络整理
导读:我最近阅读了Manuel Bernhardt的新书 Reactive Web Applications.在他的书中,他指出Scala开发人员不应该使用.get来检索可选值. 我想接受他的建议,但我正在努力避免.get用于对期货的理解. 假设我有以下代码: for { avatarUrl - avatarService.retrieve(email
我最近阅读了Manuel Bernhardt的新书 Reactive Web Applications.在他的书中,他指出Scala开发人员不应该使用.get来检索可选值.

我想接受他的建议,但我正在努力避免.get用于对期货的理解.

假设我有以下代码:

for {
        avatarUrl <- avatarService.retrieve(email)
        user <- accountService.save(Account(profiles = List(profile.copy(avatarUrl = avatarUrl)))
        userId <- user.id
        _ <- accountTokenService.save(AccountToken.create(userId,email))
      } yield {
        Logger.info("Foo bar")
      }

通常,我会使用AccountToken.create(user.id.get,email)而不是AccountToken.create(userId,email).但是,当试图避免这种不良做法时,我得到以下异常:

[error]  found   : Option[Nothing]
[error]  required: scala.concurrent.Future[?]
[error]         userId <- user.id
[error]                ^

我怎么解决这个问题?

解决方法

第一种选择

如果你真的想要用于理解,你必须将它分成几个fors,其中每个都使用相同的monad类型:

for {
  avatarUrl <- avatarService.retrieve(email)
  user <- accountService.save(Account(profiles = List(profile.copy(avatarUrl = avatarUrl)))
} yield for {
  userId <- user.id
} yield for {
  _ <- accountTokenService.save(AccountToken.create(userId,email))
}

第二种选择

另一个选择是完全避免Future [Option [T]]并使用Future [T],它可以实现为Failure(e),其中e是NoSuchElementException,只要你期望None(在你的情况下,是accountService.save()方法) :

def saveWithoutOption(account: Account): Future[User] = {
  this.save(account) map { userOpt =>
    userOpt.getOrElse(throw new NoSuchElementException)
  }
}

然后你会有:

(for {
  avatarUrl <- avatarService.retrieve(email)
  user <- accountService.saveWithoutOption(Account(profiles = List(profile.copy(avatarUrl = avatarUrl)))
  _ <- accountTokenService.save(AccountToken.create(user.id,email))
} yield {
  Logger.info("Foo bar")
}) recover {
  case t: NoSuchElementException => Logger.error("boo")
}

第三种选择

回到map / flatMap并介绍中间结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读