2016-12-01 22 views
1

調用未來的方法定義爲:在給定的情況下類<code>Person</code>循環

case class Person (first: String, middle: String, last: String) 

和案件類Band包含許多Person S:

case class Band (name: String, members: List[Person]) 

我需要的是增加中間考慮到getMiddle這個功能實際上是一個未來,所以在樂隊中的每個成員都是最初的人選。這是我的嘗試:

case class Person (first: String, middle: String, last: String) 
case class Band (name: String, members: List[Person]) 

object TestFutures3 extends App { 

    val p1 = Person ("David", "", "Gahan") 
    val p2 = Person ("Martin", "", "Gore") 
    val band = Band ("Depeche Mode", List(p1,p2)) 

    def getMiddle (name: String) = Future { 
    if (name == "Martin") 
     "L" 
    else 
     "X" 
    } 

    val membersWithMiddle = band.members.map { 
       p => Person(p.first, getMiddle(p.first).map(_), p.last) 
     } 

    println(membersWithMiddle) 

    Thread.sleep(5000) 
} 

回答

0

您可以等待未來,並直接分配中間:

val middle = Await.result(getMiddle(p.first), Duration.Inf) 
val x: Person = Person(p.first, middle, p.last) 

或者你可以返回一個未來的人:

val x: Future[Person] = getMiddle(p.first).map(middle => Person(p.first, middle, p.last) 
+0

未來的人選擇似乎更好,但如何將它集成在代碼中?你如何改變'band.members.map {'? – ps0604

+0

band.members需要成爲'List [Future [Person]]' – soote

+0

抱歉,我無法更改案例分類,它是傳統代碼 – ps0604

3

你可以使用Future.traverse

import scala.concurrent.Future 
import scala.concurrent.ExecutionContext.Implicits.global 

val setMiddleName: Person => Future[Person] = 
    member => getMiddle(member.first).map(middle => member.copy(middle = middle)) 

val bandMembers: Future[List[Person]] = 
    Future.traverse(band.members)(setMiddleName) 

bandMembers.foreach(println) 
// List(Person(David,X,Gahan), Person(Martin,L,Gore)) 

Future.traverse在此情況下具有List[Person]Person => Future[Person]函數(其將每Person執行 - 除非Future之一失敗)並返回Future[List[Person]]

+0

計算完'bandMember'之後,在打印之前不需要等待嗎? – ps0604

相關問題