将元组作为scala中的未来返回不起作用

时间:2015-10-23 12:57:17

标签: scala future

我试图通过以下方式从函数作为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])]

3 个答案:

答案 0 :(得分:4)

编译器抱怨预期会有一个元组,但它会将一个元组的Future作为返回类型f。 您可以使用Future组合器之一来处理Future中包含的值。例如,您可以使用map

f.map{case (a,c) => do something... }

此外,当您只需要返回Future但不需要异步执行计算时(例如在您的情况下),最好使用

Future.successful((List(1,2,3),List("Hello","World")))

创建已经完成的未来,以节省从线程池创建/重用线程的开销。

答案 1 :(得分:3)

您正在尝试解包元组,但fFuture,而不是Tuple2

尝试

import scala.concurrent._
import scala.concurrent.duration._

val (a, c) = Await.result(f, 1.second)

使用Await.result将阻塞,直到f完成,然后返回元组内部或抛出异常。

如果您想执行副作用回调,也可以使用onSuccess -

f.onSuccess { case (a, c) => println(a, c) }

如果您想要修改该值,但不需要返回,则可以使用map转换内容,同时仍然使用def doStuff(a: List[Int], c: List[String]): Int = ??? val g: Future[Int] = f.map(doStuff) 进行修改:

val

(另外,您应该真正构建代码以使用var而不是<li class="nav-link"><a data-scroll-goto="4" href="#contact">Contact</a></li>

答案 2 :(得分:1)

指示的f的返回类型是Future的{​​{1}}。因此,您无法为返回类型分配Tuple2。但是,您可以异步处理Tuple2的结果:

Future