返回元组作为 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])]

您正在尝试解压元组,但 fFuture,而不是 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 类型是 Tuple2Future。因此,您不能将 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 以节省从线程池创建/重用线程的开销。