如何在 akka 中将 class T 对象转换为 Future[T] 对象
How to convert a class T object into a Future[T] object in akka
我正在尝试使用 akka 和 scala 做一些事情,但我是新手。我想将 'Any' Future 的结果附加到 class
中的字段之一
所以我 class 调用 T 定义为
class T {
var a: String =_
var result = List[Any]= List()
}
现在我有一个接收未来值的变量
var futureResult:Future[Any] = //receives a future value
在一个名为 addResult 的函数中,它接受一个 T 对象和 returns 一个未来的 T 对象。
def addResult(obj1:T):Future[T] ={
var obj2:T = new T()
obj2.a = obj1.a
obj2.result = obj1.result
//I want to append results of futureResult into obj2.result when it is completed
// obj2.result = futureResult :: obj2.result
return Future(obj2)
}
我最终不得不从流中调用这个函数。
val b = Flow[T].mapAsync[T](1)(addResult(_))
您可以像这样更改注释行:
futureResult.map { res =>
obj2.result = res :: obj2.result
obj2
}
然后你就不需要最后一行了。
首先,正如@riccardo.cardin 指出的那样,使用T
作为class 的名称是非常糟糕的主意,因为T
通常指向泛型。
但是,您可以通过简单的闭包将任何逻辑放入 Future
中,在您的情况下,它看起来像这样:
Future {
new T("some string", 1 :: 2 :: 3 :: Nil)
}
之后,您可以通过 flatMap
、map
或 for comprehensive
组合异步计算,甚至可以使用 cats
black magic 和 |@|
:
for {
f1 <- future1()
f2 <- future2(f1.id)
} yield f2.name
(future1 |@| future2) map { _ - _ }
在您的情况下,此转换取决于代码的逻辑。
我正在尝试使用 akka 和 scala 做一些事情,但我是新手。我想将 'Any' Future 的结果附加到 class
中的字段之一所以我 class 调用 T 定义为
class T {
var a: String =_
var result = List[Any]= List()
}
现在我有一个接收未来值的变量
var futureResult:Future[Any] = //receives a future value
在一个名为 addResult 的函数中,它接受一个 T 对象和 returns 一个未来的 T 对象。
def addResult(obj1:T):Future[T] ={
var obj2:T = new T()
obj2.a = obj1.a
obj2.result = obj1.result
//I want to append results of futureResult into obj2.result when it is completed
// obj2.result = futureResult :: obj2.result
return Future(obj2)
}
我最终不得不从流中调用这个函数。
val b = Flow[T].mapAsync[T](1)(addResult(_))
您可以像这样更改注释行:
futureResult.map { res =>
obj2.result = res :: obj2.result
obj2
}
然后你就不需要最后一行了。
首先,正如@riccardo.cardin 指出的那样,使用T
作为class 的名称是非常糟糕的主意,因为T
通常指向泛型。
但是,您可以通过简单的闭包将任何逻辑放入 Future
中,在您的情况下,它看起来像这样:
Future {
new T("some string", 1 :: 2 :: 3 :: Nil)
}
之后,您可以通过 flatMap
、map
或 for comprehensive
组合异步计算,甚至可以使用 cats
black magic 和 |@|
:
for {
f1 <- future1()
f2 <- future2(f1.id)
} yield f2.name
(future1 |@| future2) map { _ - _ }
在您的情况下,此转换取决于代码的逻辑。