Le type Future[A]

Transcription

Le type Future[A]
Sûreté de la programmation orientée objets
(NFP101)
Le type Future[A]
Le type Future[A] (défini dans scala.concurrent.Future) représente un calcul qui doit
ultimement (à un moment dans le futur) renvoyer un résultat de type A.
Si e est une expression de type A, on peut créer un tel calcul en utilisant simplement le constructeur Future(e). Ce calcul s’execute ensuite de manière concurrente.
On peut aussi stocker ce calcul, par exemple dans une variable x, et il est possible ensuite de
récupérer le résultat avec l’expression Await.result(x, Duration.Inf).
On doit obligatoirement préciser le temps que l’on est prêt à attendre pour obtenir le résultat
(éventuellement indéfiniment comme dans cet exemple). Comme la fonction Await.result est
bloquante, il faudrait l’utiliser le moins possible et, idéalement, uniquement pour obtenir le
résultat final.
Pour tester ces exemples, vous aurez besoin d’importer les classes suivantes :
import scala.concurrent._
import scala.concurrent.duration._
import scala.concurrent.ExecutionContext.Implicits._
1. Pour faire les tests avec de “vrais” calculs, nous donnons l’implantation naïve suivante de
la suite de Fibonacci :
def fib(n: Int): Int = {
if (n <= 1) 1
else fib(n - 1) + fib(n - 2)
}
Le plus grand terme de la suite calculable avec des entiers 32 bits signés est fib(45) et le
temps de calcul est de quelques secondes.
2. Définir la fonction suivante :
def getResult[A](x : Future[A]): A = Await.result(x, Duration.Inf)
et faire les tests suivant :
val x1 = Future(fib(45))
val r1 = getResult(x1)
val x2 = List(Future(fib(43)), Future(fib(44)), Future(fib(45)))
val r2 = x2.map(x => getResult(x))
3. Implanter les fonctions suivantes, en utilisant le constructeur Future et les méthodes
filter, map, flatMap du type Future :
•
map [A,B](f: A => B, z: List[Future[A]]): List[Future[B]]
•
flatMap [A,B](f: A => Future[B], z: List[Future[A]]): List[Future[B]]
•
filter [A](p: A => bool, z: List[Future[A]]): List[Future[Option[A]]]
•
collect [A](z : List[Future[A]]): Future[List[A]])
1

Documents pareils