Scala将Future [Option [Account]]转换为Future [[String,Option [Account]]]

时间:2014-05-30 23:02:52

标签: scala future

我有以下方法返回期货:

db.find(uuid, accountName): Future[Option[Account]]

db.add(uuid, account): Future[Option[Account]]

我想编写一个程序,使用未来在数据库中查找用户。 如果不是,则应将用户条目添加到数据库中。 在任何一种情况下,我都希望得到一个Future[Either[String, Option[Account]]]对象。 我在编写以下内容时遇到编译器错误:

def add(uuid: UUID, account: Account): Future[Either[String, Option[Account]]] =
    db.find(userId, account.name).map {
        case None =>    
            db.add(userId.uuid, account).map(Right(_))
        case Some(existAccount) =>
            Left(s"Account already exist $existAccount")
    }

修改 这段代码不能编译错误:

Error:(77, 41) type mismatch;
 found   : scala.concurrent.Future[scala.util.Right[Nothing,Option[Account]]]
 required: Either[String,Option[Account]]
        db.add(userId, account).map(Right(_))
                                        ^

解决: 解决方案是:

object Test extends App {
  import concurrent._
  import ExecutionContext.Implicits._
  import duration.Duration._
  type Account = String
  val found = """(.+)\1""".r
  def find(name: String) = name match {
    case found(_*) => Future(Option(name))
    case _         => Future(None)
  }
  def add(account: Account) = Future(Option(account * 2))

  def f(account: Account): Future[Either[String, Option[Account]]] = {
    find(account) flatMap {
      case None => add(account) map (Right(_))
      case Some(x) => Future successful Left(s"already $account")
    }
  }
  Console println Await.result(f("bob"), Inf)
  Console println Await.result(f("bobbob"), Inf)
}

0 个答案:

没有答案