Scala 如何最好地处理Future.filter谓词不满足类型错误
我喜欢scala的类型安全性,但我经常遇到的一个运行时错误是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
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/Tryfilter
方法将成功转换为失败。如果您查看或的实现,这是通过使用包含谓词的new NoSuchElementException
返回失败来完成的不满意
您提到的消息
因此,错误消息本身完全是经过设计的,并且与类型系统一致。理解过程中的任何步骤都只会预测另一个未来,因此,如果account.isconfirm通过筛选,则写入将显示成功,如果未通过筛选,则显示失败
这就是为什么Scala在使用if
/filter
时不会将Future[Result]更改为Future[Option[Result]]的原因。如果您希望生成一个包含选项的成功Future或一个空Seq,则必须显式地这样做(如和answers中所示).如果将结果类型声明为result
,它如何返回选项?恢复未来的以产生有意义的错误。r
不应该是未来的[结果]
?@m-z是的,我将其更改为将来的版本,谢谢。但我想在for comp中处理此问题,因为我当前正在使用它们allot。或者这是不可能的?如何有条件地将成功的accountServer转换为失败?这种方法有任何潜在的缺点吗?