2017-04-19 37 views
0

我有一些函数返回元组元素(Int,Int)的列表与未来。为了简单起见,我将定义两个期货过滤两个未来[Seq]理解scala

val f1 = Future { 
    List((8, 3), (2, 1), (4, 2), (3, 4)) 
    } 
    val f2 = Future { 
    List((2, 3), (5, 1), (7, 9)) 
    } 

我想过滤并从下面的条件中获取这两个未来列表中的元素。

元组包含在第二位置

相同元件在这种情况下输出应该是

List(((2,1),(5,1)), ((8,3),(2,3))) 

我可以用正常的列表有用于理解这样做(不期货)象下面

val l1 = List((4, 2), (3, 4), (2, 1), (8, 3)) 
val l2 = List((2, 3), (5, 1), (7, 9)) 

val o = for { 
    a <- l1 
    b <- l2 if a._2 == b._2 
} yield (a, b) 

如何做到这一点与期货?

+0

“压缩”? – pedrofurla

+0

@pedrofurla编辑 - >理解 – eranga

回答

3

,如果你想使用完整的理解其他的解决方案:

val o2 = for { 
    l1 <- f1 
    l2 <- f2 
} yield for { 
    a <- l1 
    b <- l2 if a._2 == b._2 
} yield (a,b) 

当然,你将有未来在这里,所以你需要以等待结果或进一步传递到一些东西,会对其进行处理

1

另一种可能性是从scalaz的ListT单子变压器(although it violates the associative law):

import scala.concurrent.ExecutionContext.Implicits.global 
import scala.concurrent.{Await, Future} 
import scalaz.Scalaz._ 
import scalaz._ 
import scala.concurrent.duration._ 

def main(args: Array[String]): Unit = { 
    val f1 = Future { 
    List((8, 3), (2, 1), (4, 2), (3, 4)) 
    } 

    val f2 = Future { 
    List((2, 3), (5, 1), (7, 9)) 
    } 

    val first = ListT[Future, (Int, Int)](f1) 
    val second = ListT[Future, (Int, Int)](f2) 

    val res = for { 
    a <- first 
    b <- second if a._2 == b._2 
    } yield (a, b) 

    println(Await.result(res.run, 3 seconds)) 
}