返回元组作为 Scala 中的未来不起作用
Returning tuple as a future in scala not working
我正在尝试通过以下方式 return 来自 Future 函数的元组:
def f:Future[(List[Int],List[String])] = Future{
(List(1,2,3),List("Hello","World"))
}
我从 main 调用如下:
var (a,c) = f
这给了我以下错误
Error: constructor cannot be instantiated to expected type;
found : (T1, T2)
required: scala.concurrent.Future[(List[Int], List[String])]
您正在尝试解压元组,但 f
是 Future
,而不是 Tuple2
。
尝试
import scala.concurrent._
import scala.concurrent.duration._
val (a, c) = Await.result(f, 1.second)
使用Await.result
会阻塞直到f
完成,然后return里面的元组或者抛出异常。
如果要执行副作用回调,也可以使用onSuccess
-
f.onSuccess { case (a, c) => println(a, c) }
如果你想修改值但你还不需要 return,你可以在将来使用 map
:
def doStuff(a: List[Int], c: List[String]): Int = ???
val g: Future[Int] = f.map(doStuff)
(此外,您真的应该构建代码以使用 val
而不是 var
)
如所示,f
的 return 类型是 Tuple2
的 Future
。因此,您不能将 Tuple2
分配给 return 类型。但是,您可以异步处理 Future
的结果:
def f:Future[(List[Int],List[String])] = Future{
(List(1,2,3),List("Hello","World"))
}
f onSuccess { case (a,c) => ...}
编译器抱怨需要一个元组,但是它得到了一个元组的 Future 作为 f
的 return 类型。
您可以使用 Future 组合器之一来处理包装在 Future 中的值。例如,您可以使用 map
:
f.map{case (a,c) => do something... }
此外,当您只需要 return 一个 Future 但不需要异步执行计算时,例如在您的情况下,最好使用
Future.successful((List(1,2,3),List("Hello","World")))
创建一个已经完成的 future 以节省从线程池创建/重用线程的开销。
我正在尝试通过以下方式 return 来自 Future 函数的元组:
def f:Future[(List[Int],List[String])] = Future{
(List(1,2,3),List("Hello","World"))
}
我从 main 调用如下:
var (a,c) = f
这给了我以下错误
Error: constructor cannot be instantiated to expected type;
found : (T1, T2)
required: scala.concurrent.Future[(List[Int], List[String])]
您正在尝试解压元组,但 f
是 Future
,而不是 Tuple2
。
尝试
import scala.concurrent._
import scala.concurrent.duration._
val (a, c) = Await.result(f, 1.second)
使用Await.result
会阻塞直到f
完成,然后return里面的元组或者抛出异常。
如果要执行副作用回调,也可以使用onSuccess
-
f.onSuccess { case (a, c) => println(a, c) }
如果你想修改值但你还不需要 return,你可以在将来使用 map
:
def doStuff(a: List[Int], c: List[String]): Int = ???
val g: Future[Int] = f.map(doStuff)
(此外,您真的应该构建代码以使用 val
而不是 var
)
如所示,f
的 return 类型是 Tuple2
的 Future
。因此,您不能将 Tuple2
分配给 return 类型。但是,您可以异步处理 Future
的结果:
def f:Future[(List[Int],List[String])] = Future{
(List(1,2,3),List("Hello","World"))
}
f onSuccess { case (a,c) => ...}
编译器抱怨需要一个元组,但是它得到了一个元组的 Future 作为 f
的 return 类型。
您可以使用 Future 组合器之一来处理包装在 Future 中的值。例如,您可以使用 map
:
f.map{case (a,c) => do something... }
此外,当您只需要 return 一个 Future 但不需要异步执行计算时,例如在您的情况下,最好使用
Future.successful((List(1,2,3),List("Hello","World")))
创建一个已经完成的 future 以节省从线程池创建/重用线程的开销。