我喜欢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 { ... }
如果帐户未确认,我将收到上述错误.
我原以为,由于过滤器有可能失败,因此该scala会使yield返回值成为Option.没有?
filter
没有意义,Future
因为类型系统不知道该else
案件要返回什么,所以依靠它是不安全的(通过使用if-guard).但你可以在for-comprehension中做到这一点来实现同样的目的:
val r: Future[play.api.mvc.Result] = for { account <- accountServer.get(...) orders <- if (account.isConfirmed) orderService.get(account, ...) else Future.successful(Seq.empty) } yield { ... }
(作为Jean Logeart的答案,但在理解中)