Scala 如何最好地处理Future.filter谓词不满足类型错误

Scala 如何最好地处理Future.filter谓词不满足类型错误,scala,playframework,future,Scala,Playframework,Future,我喜欢scala的类型安全性,但我经常遇到的一个运行时错误是 Future.filter predicate is not satisfied 我能理解为什么我会犯这个错误,只是想寻求关于如何最好地解决这个错误并优雅地处理它的建议,或者也许我做错了 val r: Future[play.api.mvc.Result] = for { account <- accountServer.get(...) if account.isConfirmed orders <- o

我喜欢scala的类型安全性,但我经常遇到的一个运行时错误是

 Future.filter predicate is not satisfied
我能理解为什么我会犯这个错误,只是想寻求关于如何最好地解决这个错误并优雅地处理它的建议,或者也许我做错了

val r: Future[play.api.mvc.Result] = for {
  account <- accountServer.get(...)
  if account.isConfirmed
  orders <- orderService.get(account, ...)
} yield {
  ...
}
val r:Future[play.api.mvc.Result]=for{

account您可能希望使用一个简单的
flatMap
,您可以在其中指定一个
else
案例:

val orders = accountServer.get(...)
                          .flatMap { account => 
                            if(account.isConfirmed) orderService.get(account, ...)
                            else Future.successful(Seq.empty)
                          }

filter
对于
Future
没有意义,因为类型系统不知道为
else
案例返回什么,因此依赖它是不安全的(通过使用if-guard)。但是您可以在一个范围内执行此操作,以便理解以实现相同的目的:

val r: Future[play.api.mvc.Result] = for {
  account <- accountServer.get(...)
  orders <- if (account.isConfirmed) orderService.get(account, ...) 
            else Future.successful(Seq.empty) 
} yield {
  ...
}
val r:Future[play.api.mvc.Result]=for{
accountA用于一系列的
foreach
map
flatMap
filter
等。当您编写
if account.isconfirm
时,这相当于使用Future的
filter
方法

解决了的未来的价值包含在一次尝试中,它可以采取成功或失败的形式。(将此与选项进行比较,后者可以采取一些形式,也可以不采取任何形式。)

与选项的
filter
非常相似,如果包含的值使谓词失败,则Future/Try
filter
方法将成功转换为失败。如果您查看或的实现,这是通过使用包含
谓词的
new NoSuchElementException
返回失败来完成的不满意
您提到的消息

因此,错误消息本身完全是经过设计的,并且与类型系统一致。理解过程中的任何步骤都只会预测另一个未来,因此,如果account.isconfirm
通过筛选,则写入
将显示成功,如果未通过筛选,则显示失败


这就是为什么Scala在使用
if
/
filter
时不会将Future[Result]更改为Future[Option[Result]]的原因。如果您希望生成一个包含选项的成功Future或一个空Seq,则必须显式地这样做(如和answers中所示).

如果将结果类型声明为
result
,它如何返回选项?
恢复
未来的
以产生有意义的错误。
r
不应该是
未来的[结果]
?@m-z是的,我将其更改为将来的版本,谢谢。但我想在for comp中处理此问题,因为我当前正在使用它们allot。或者这是不可能的?如何有条件地将成功的
accountServer转换为失败?这种方法有任何潜在的缺点吗?