2015-10-23 69 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做一些事情......}「 –

相關問題