Skip to content

Instantly share code, notes, and snippets.

@v6ak
Last active August 29, 2015 14:20
Show Gist options
  • Save v6ak/dde38fe94bd98a26724f to your computer and use it in GitHub Desktop.
Save v6ak/dde38fe94bd98a26724f to your computer and use it in GitHub Desktop.
scala> import scala.concurrent._
import scala.concurrent._
scala> // Nadefinujeme funkci plus. Ta chce kromě hodnot ke sčítání také ExecutionContext, který určuje,
//kde se to vykoná.
scala> def plus(x: Int, y: Int)(implicit ec: ExecutionContext) = Future{x+y}
plus: (x: Int, y: Int)(implicit ec: scala.concurrent.ExecutionContext)scala.concurrent.Future[Int]
scala> // Podobně nadefinujeme i sum. Bude pracovat se spojovými seznamy. Bacha při kopírování na
// znaky „|“, ty nekopíruj, tím jen Scala značí, že ode mne ještě nějaký vstup očekává.
scala> def sum(xs: List[Int])(implicit ec: ExecutionContext): Future[Int] = xs match {
| case x::y::xs => plus(x, y).flatMap{r => sum(r::xs)}
| case x::Nil => Future.successful(x)
| case Nil => Future.successful(0)
| }
sum: (xs: List[Int])(implicit ec: scala.concurrent.ExecutionContext)scala.concurrent.Future[Int]
scala> // Nyní máme nadefinováno. Můžeme použít. Nejdříve budeme potřebovat nějaký ExecutionContext,
// použijeme tedy ten defaultní.
scala> import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.Implicits.global
scala> // Necháme počítat…
scala> sum(List(1, 2, 3, 4, 5))
res0: scala.concurrent.Future[Int] = scala.concurrent.impl.Promise$DefaultPromise@f51585e
scala> // Future se nám uložila do proměnné res0, protože jsme si nevybrali jiný název.
scala> // Podíváme se, jestli to už skončilo, jak případně dopadl výpočet (úspěch nebo výjimka)
// a jakou hodnotu to případně vrátilo.
scala> res0.value
res1: Option[scala.util.Try[Int]] = Some(Success(15))
scala> // V praxi se (_: Future[_]).value ani isCompleted moc nepoužívá, spíše se používá
// onCompleted (asynchronní přístup), nebo Await.result (synchronní přístup, možno použít timeout),
// nebo se to nechá na vhodném frameworku…
scala> Můžeme použít foreach (případně velmi podobnou metodu onSuccess), který zavolá println,
// až to bude hotové. (V tomto případě ihned.) Bohužel ale tím neřešíme chyby.
scala> res0.foreach(println)
15
scala> // Pak bychom tedy měli zaregistrovat i handler pro chybu…
scala> res0.onFailure{case e => println(s"FAILED: $e")}
scala> // Nebo můžeme obsloužit obě varianty jedním handlerem…
scala> import scala.util.{Try, Success, Failure}
import scala.util.{Try, Success, Failure}
scala> res0.onComplete{
| case Success(value) => println(value)
| case Failure(e) => println(s"FAILED: $e")
| }
15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment