scala返回未来[选项[用户]]

时间:2016-04-11 15:22:37

标签: scala

所以,我对Scala来说是全新的,来自Java背景,并且已经获得了一个巨大的scala代码库来学习。而且,我很失落,也会感激任何帮助。

我有以下功能,我想重新安排。目前,该函数连续调用两个函数,然后返回结果。第一个函数返回一个布尔值,第二个函数返回一个User。但是,实际应该发生的是,只有在第一个函数返回true时才应调用第二个函数。因此,我需要重新排列它以在继续之前检查第一个函数的返回值。每次我重写它来做到这一点,我要么得到编译错误或异常。它应该返回Future [Option [User]]并且第一个函数不返回User。我只想在FunctionA失败时返回None,但因为它期望Future [Option [X]]],所以它很不开心。所以,下面是函数:

private def profileForCredentials(userId: String, password: String)(implicit ec: ExecutionContext): Future[Option[User]] =
  {
      val credentials: Throwable \/ Boolean = {
      try {
         FunctionA(userId, password).right[Throwable]
      }
      catch {
        case npe: NullPointerException =>
          npe.left[Boolean]
      }
    }

    //This function doesn't need to be called unless credentials=true
    FunctionB(id, userId).map {
        case maybeUser@Some(user) =>
          credentials match {
            case \/-(x) if x =>
              user.some
            case _ =>
              None
          }
        case None =>
          None
      }
}

1 个答案:

答案 0 :(得分:3)

你们刚刚被scalaz带走了。 我要给这个页面添加书签,以便向工作人员展示为什么我们不应该使用所有这些花哨的东西。

这样做:

    Try { 
       FunctionA(userId, password)
    }
    .toOption
    .collect { case(true) => 
      FunctionB(id, userId)
    }
    .getOrElse(Future.value(None))