所以,我对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
}
}
答案 0 :(得分:3)
你们刚刚被scalaz带走了。 我要给这个页面添加书签,以便向工作人员展示为什么我们不应该使用所有这些花哨的东西。
这样做:
Try {
FunctionA(userId, password)
}
.toOption
.collect { case(true) =>
FunctionB(id, userId)
}
.getOrElse(Future.value(None))