2017-04-19 1 views
0

J'ai quelques fonctions qui retourne la liste des éléments de tuple (Int, Int) avec future. Pour la simplicité je vais définir deux futuresFiltre deux Future [Seq] avec pour la compréhension scala

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

Je veux filtrer et obtenir les éléments de ces deux listes futures avec les critères ci-dessous.

Tuples qui contient même élément en deuxième position

Dans cette sortie de scénario devrait être

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

Je peux le faire avec des listes normales (sans terme) avec pour la compréhension comme ci-dessous

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) 

Comment le faire avec des contrats à terme?

+0

"pour la compression"? – pedrofurla

+0

@pedrofurla édité -> compréhension – eranga

Répondre

3

solution supplémentaire si vous souhaitez utiliser pleinement la compréhension:

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

Bien sûr, vous aurez l'avenir ici, donc vous avez besoin d'attendre pour résultat ou transmettre encore à quelque chose qui le traitera

1

une autre possibilité serait le ListT transformateur monade de scalaz (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)) 
}