我试图通过以下方式从函数作为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])]
答案 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)
您正在尝试解包元组,但f
是Future
,而不是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