gpt4 book ai didi

scala - 如何从 Scala 中的 Future 返回不同的结果而不以嵌套 if 语句结束

转载 作者:行者123 更新时间:2023-12-02 20:04:19 27 4
gpt4 key购买 nike

我实际上正在寻找一个更好的 Scala 构造,以在不同条件下从 Future 返回不同的结果。

可以说,在Future中,我需要在返回成功结果之前进行某些验证。有两种方法可以做到这一点。

方式一:

Future {
if(!validation1()) return Future.failed("Validation1 failed!")
if(!validation2()) return Future.failed("Validation2 failed!")
if(!validation3()) return Future.failed("Validation3 failed!")

Future.successful()
}.flatMap(identity)

方式二:

Future {
if(!validation1())
Future.failed("Validation1 failed!")
else {
if(!validation2())
Future.failed("Validation2 failed!")
else {
if(!validation3())
Future.failed("Validation3 failed!")
else {
Future.successful("Results")
}
}
}
}.flatMap(identity)

但是方式我有问题,它导致异常scala.runtime.NonLocalReturnControl。您可以在此链接中找到说明: https://tpolecat.github.io/2014/05/09/return.html

这给我们留下了方式二。但这种构造的问题是,随着验证数量的增加,它很快就会变得丑陋。

谁能提出更好的表达方式?

请告诉我这个问题是否适合在这里提问,或者这个问题需要以更好的方式表达。

TIA。

最佳答案

考虑将每个验证提取到单独的 Future

def val1():Furure[String] = 
if validation1() Future.failed("Validation1 failed") else Future.successful("Result")

def val2():Furure[String] =
if validation2() Future.failed("Validation2 failed") else Future.successful("Result")

def val3():Furure[String] =
if validation3() Future.failed("Validation3 failed") else Future.successful("Result")

然后使用flatMap按顺序链接它们

val1().flatMap(_ => val2()).flatMap(_ => val3())

或使用语法糖

for {
_ <- val1()
_ <- val2()
result <- val3()
} yield result

关于scala - 如何从 Scala 中的 Future 返回不同的结果而不以嵌套 if 语句结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49050777/

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