Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 1. Let's try Future composition (suppose all the Futures are independent!)
- import java.time.LocalDateTime
- import scala.concurrent.ExecutionContext.Implicits.global
- import scala.concurrent.Future
- import scala.io.StdIn
- import scala.language.postfixOps
- object Main extends App {
- def print(x: Any): Unit = {Thread.sleep(50); println(s"${LocalDateTime.now()}: $x")}
- def f1 = Future {
- print("Future 1 started")
- Thread.sleep(3000)
- print("Future 1 finished")
- 5
- }
- def f2 = Future {
- print("Future 2 started")
- Thread.sleep(3000)
- print("Future 2 finished")
- true
- }
- def f3 = Future {
- print("Future 3 started")
- Thread.sleep(3000)
- print("Future 3 finished")
- "Tommy"
- }
- val result = for {
- x <- f1
- y <- f2
- z <- f3
- } yield (x, y, z)
- print("Press ENTER to finish")
- StdIn.readLine()
- print(s"result is $result")
- }
- // Output (note seconds!):
- // 2018-02-27T22:24:33.867: Press ENTER to finish
- // 2018-02-27T22:24:33.867: Future 1 started
- // 2018-02-27T22:24:36.924: Future 1 finished
- // 2018-02-27T22:24:36.975: Future 2 started
- // 2018-02-27T22:24:40.025: Future 2 finished
- // 2018-02-27T22:24:40.076: Future 3 started
- // 2018-02-27T22:24:43.126: Future 3 finished
- // 2018-02-27T22:24:46.707: result is Future(Success((5,true,Tommy)))
- // 2. Now let's do it simultaneously!
- val runF1 = f1 // start Future #1!
- val runF2 = f2 // start Future #2!
- val runF3 = f3 // start Future #3!
- print("Now we can use for-comprehension")
- val result = for {
- x <- runF1
- y <- runF2
- z <- runF3
- } yield (x, y, z)
- // Output (note seconds!):
- // 2018-02-27T22:27:03.395: Future 1 started
- // 2018-02-27T22:27:03.395: Future 3 started
- // 2018-02-27T22:27:03.395: Future 2 started
- // 2018-02-27T22:27:03.395: Now we can use for-comprehension
- // 2018-02-27T22:27:03.455: Press ENTER to finish
- // 2018-02-27T22:27:06.452: Future 1 finished
- // 2018-02-27T22:27:06.452: Future 2 finished
- // 2018-02-27T22:27:06.452: Future 3 finished
- // 2018-02-27T22:27:07.949: result is Future(Success((5,true,Tommy)))
- // 3. Bonus! If all the Futures return the same type (e.g. Int), we can use 'sequence'.
- // if the types are different, it still works, but casts to a most common type (e.g. to Any).
- object Main extends App {
- def print(x: Any): Unit = {Thread.sleep(50); println(s"${LocalDateTime.now()}: $x")}
- def f1 = Future {
- print("Future 1 started")
- Thread.sleep(3000)
- print("Future 1 finished")
- 5
- }
- def f2 = Future {
- print("Future 2 started")
- Thread.sleep(3000)
- print("Future 2 finished")
- 6
- }
- def f3 = Future {
- print("Future 3 started")
- Thread.sleep(3000)
- print("Future 3 finished")
- 7
- }
- val result: Future[List[Int]] = Future.sequence(List(f1, f2, f3))
- print("Press ENTER to finish")
- StdIn.readLine()
- print(s"result is $result")
- }
- //Output:
- //2018-02-27T22:28:27.663: Future 2 started
- //2018-02-27T22:28:27.663: Future 1 started
- //2018-02-27T22:28:27.663: Future 3 started
- //2018-02-27T22:28:27.663: Press ENTER to finish
- //2018-02-27T22:28:30.719: Future 2 finished
- //2018-02-27T22:28:30.719: Future 1 finished
- //2018-02-27T22:28:30.719: Future 3 finished
- //2018-02-27T22:28:31.665: result is Future(Success(List(5, 6, 7)))
- // 3. Bonus #2! 'traverse' is more generic variant of 'sequence':
- object Main extends App {
- def print(x: Any): Unit = {Thread.sleep(50); println(s"${LocalDateTime.now()}: $x")}
- def f(x: Int) = Future {
- print("Future started")
- Thread.sleep(3000)
- print("Future finished")
- x*x
- }
- val result: Future[List[Int]] = Future.traverse(List(1, 2, 3, 4)) {t => f(t)}
- print("Press ENTER to finish")
- StdIn.readLine()
- print(s"result is $result")
- }
- //Output:
- //2018-02-27T22:30:40.698: Future started
- //2018-02-27T22:30:40.698: Future started
- //2018-02-27T22:30:40.698: Future started
- //2018-02-27T22:30:40.698: Press ENTER to finish
- //2018-02-27T22:30:40.698: Future started
- //2018-02-27T22:30:43.756: Future finished
- //2018-02-27T22:30:43.756: Future finished
- //2018-02-27T22:30:43.757: Future finished
- //2018-02-27T22:30:43.758: Future finished
- //2018-02-27T22:30:45.072: result is Future(Success(List(1, 4, 9, 16)))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement