2015-10-23 34 views
1

我试图从功能未来在以下方法返回一个元组返回元组的未来:Scala中不工作

def f:Future[(List[Int],List[String])] = Future{ 
    (List(1,2,3),List("Hello","World")) 
} 

这我是从主调用如下:

var (a,c) = f 

这是给我下面的错误

Error: constructor cannot be instantiated to expected type; 
found : (T1, T2) 
required: scala.concurrent.Future[(List[Int], List[String])] 

回答

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

+0

是的,我知道了......非常感谢 –

1

f的返回类型是FutureTuple2。因此,您不能将Tuple2分配给返回类型。你可以,但是,处理Future异步结果:

def f:Future[(List[Int],List[String])] = Future{ 
    (List(1,2,3),List("Hello","World")) 
} 

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

编译器抱怨元组的预期,但是它得到一个元组为f返回类型的未来。 您可以使用Future组合器之一来处理未来包装的值。例如,你可以使用map

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

此外,当你只需要返回未来,但并不需要异步执行的计算,比如在你的情况下,最好使用

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

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

+0

为什么这种地图场景需要这种情况? – ChampS

+0

@ChampS这种情况并不是必须的,只是为了方便将元组提取出来。我可以写'f.map {t =>用t._1和t._2做一些事情......}“ –

相关问题