我有兩個相同型別的物件,但我想使用這些物件呼叫方法,但取決于幾個布林值。
def myMethod(a: Boolean, b: Boolean, obj1: MyClass, obj2: MyClass): Future[Done] = {
if(a) obj1.methodWhichReturnsFuture()
if(b) obj2.methodWhichReturnsFuture()
}
這里方法#methodWhichReturnsFuture 有回傳typr Future[Done]。這顯示錯誤,因為我在這里回傳 Unit。我雖然創建了一個'var'并在兩個方法呼叫中分配它,但看起來它不是一個好方法。這絕對是基本的,但我想知道實作它的更好方法是什么?謝謝
uj5u.com熱心網友回復:
在 Scala 中,if沒有 anelse只能執行副作用,因此結果值為
if (a) obj1.methodWhichReturnsFuture()
Unit將被丟棄并且( )的單例值()將是結果。陳述句中也會發生同樣的情況if (b)(從技術上講,這()將是 的結果myMethod,但與 的結果相同())if (a)。
因此,您將需要添加else也導致 a 的子句,Future[Done]并確定如果兩者都為真,您希望結果是什么a(b此外,如果您希望同時進行obj1andobj2呼叫,您將需要決定是否按順序執行它們或并行)以及如果兩者a都是b假的。
值得慶幸的是,因為Done是一個單例(就編碼“發生這種情況”而言,它與編碼基本相同Unit,但是對于使用 Akka 的 Java 代碼來說,這種方式更好),所以有一個合理的默認值Future[Done]:(Future.successful(Done)基本上可以解釋為“是的,當然,我做到了(但實際上沒有什么可做的)”)。
因此,如果您想同時執行obj1andobj2呼叫(或至少沒有定義的“之前發生”關系),您可以撰寫:
val obj1Fut = if (a) obj1.methodWhichReturnsFuture() else Future.successful(Done)
val obj2Fut = if (b) obj2.methodWhichReturnsFuture() else Future.successful(Done)
// exploits eagerness of Future, won't complete until both obj1Fut and obj2Fut have completed
obj1Fut.flatMap(_ => obj2Fut)
如果您不想在obj2通話后執行obj1通話:
val obj1Fut = if (a) obj1.methodWhichReturnsFuture() else Future.successful(Done)
obj1Fut.flatMap { _ =>
if (b) obj2.methodWhichReturnsFuture()
else Future.successful(Done)
}
請注意,在Unit您提供的回傳代碼中,future 很可能在obj2future 完成之前obj1完成。
如果你只想在obj1兩者都為真時撥打a電話b:
if (a) obj1.methodWhichReturnsFuture()
else if (b) obj2.methodWhichReturnsFuture()
else Future.successful(Done)
// or the equivalent pattern match, which might be more legible than if else if else
// (a, b) match {
// case (true, _) => obj1.methodWhichReturnsFuture()
// case (false, true) => obj2.methodWhichReturnsFuture()
// case (false, false) => Future.successful(Done)
// }
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/444251.html
標籤:斯卡拉
