gpt4 book ai didi

scala - 内部过滤——用futures理解

转载 作者:行者123 更新时间:2023-12-01 13:43:10 24 4
gpt4 key购买 nike

我正在做这样的事情:

 (for { 
data <- Future(getData)
updated = makeChanges(data) if updated != data
_ <- Future(saveUpdates(updated))
_ <- Future(recordTransaction)
} yield ()).recover { case e: NoSuchElementException => () }

当过滤器不满足时,它通过抛出异常(不好!)跳过剩余的两个步骤(好!),我必须在最后捕获并处理。虽然使用异常进行流量控制对我来说并不太优雅,但我想知道是否有更好的方法来做到这一点,除了显而易见的 - 用 if 语句包装所有剩余的行:

   _ <- if(updated != data) Future(saveUpdates(updated)) else Future.successful(())
_ <- if(updated != data) ...

最佳答案

我不认为你可以通过这种方式避免使用 for comprehension 的流程控制异常,你可以使用嵌套表达式而不是过滤器并手动处理条件,为 scala 提供它需要的返回类型,以防条件不满意:

for {
data <- Future(data)
updated = makeChanges(data)
res = {
if (updated != data) Future.successful(())
else for {
_ <- Future(saveUpdates(updated))
_ <- Future(recordTransaction)
} yield ()
}
} yield res

但是对于这个例子,我会采用简单的方法并删除 for comprehension,这会导致代码更具可读性(尽管您的实际用例可能更复杂):

Future(data).flatMap(d => {
val updated = makeChanges(d)
if(updated == d) Future.successful(())
else Future(saveUpdates(updated)).map(_ => recordTransaction)
})

关于scala - 内部过滤——用futures理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38222272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com