import scala.util.Properties.versionNumberString
versionNumberString
import scala.util.Properties.versionNumberString res50_1: String = "2.12.11"
import scala.concurrent._
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.Implicits.global
Thread.currentThread().getName()
res53: String = "scala-interpreter-1"
def slowOperationFuture(name: String): Future[String] = {
Future{
Thread.sleep(1000)// do nothing for 1 second
name + " returned!"
}
}
defined function slowOperationFuture
def slowOperation(name: String): String = {
Thread.sleep(1000)// do nothing for 1 second
name + " returned!"
}
defined function slowOperation
def fastOperation(name: String): String = {
name + " returned!"
}
defined function fastOperation
def printSlowFuture(name: String) = {
Future{
Thread.sleep(1000)// do nothing for 1 second
println(name + " returned!")
}
}
defined function printSlowFuture
def printSlow(name: String) = {
Thread.sleep(1000)// do nothing for 1 second
println(name + " returned!")
}
defined function printSlow
def printFast(name: String) = {
println(name + " returned!")
}
defined function printFast
def mainLoop() : Unit = {
Future{ printSlow("first!") }
printFast("second!")
Thread.sleep(5000)
}
mainLoop()
second! returned! first! returned!
defined function mainLoop
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
Await.result(slowOperationFuture("foo"), 2.seconds)
import scala.concurrent._ import scala.concurrent.ExecutionContext.Implicits.global import scala.concurrent.duration._ res64_3: String = "foo returned!"
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
Await.result(slowOperationFuture("foo"), 500.milliseconds)
java.util.concurrent.TimeoutException: Futures timed out after [500 milliseconds] scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:259) scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:263) scala.concurrent.Await$.$anonfun$result$1(package.scala:220) scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:57) scala.concurrent.Await$.result(package.scala:146) ammonite.$sess.cmd66$Helper.<init>(cmd66.sc:5) ammonite.$sess.cmd66$.<init>(cmd66.sc:7) ammonite.$sess.cmd66$.<clinit>(cmd66.sc:-1)
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
// note that this is a synchronous (blocking) function
def makeTextUpperCaseFast(inputText: String): String = inputText.toUpperCase
slowOperationFuture("foo")
.map(output => makeTextUpperCaseFast(output))
Await.result(slowOperationFuture("foo")
.map(output => makeTextUpperCaseFast(output)), 2.seconds)
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
// note that this is a synchronous (blocking) function
defined function makeTextUpperCaseFast
res74_4: Future[String] = Success("FOO RETURNED!")
res74_5: String = "FOO RETURNED!"
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
// note that this is an asynchronous (nonblocking) function
def makeTextUpperCaseSlowFuture(inputText: String): Future[String] = {
Future{
Thread.sleep(1500) // Do nothing for 1,5 seconds
inputText.toUpperCase
}
}
slowOperationFuture("foo")
.flatMap(output => makeTextUpperCaseSlowFuture(output))
import scala.concurrent._
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.duration._
// note that this is a synchronous (blocking) function
defined function makeTextUpperCaseSlowFuture
res75_4: Future[String] = Success("FOO RETURNED!")
def countNumberOfLettersSlowFuture(inputText: String): Future[Int] = {
Future{
Thread.sleep(1000)
inputText.size
}
}
def multiplyByTwoFast(num: Int):Int = num * 2
for {
result <- slowOperationFuture("foo")
uppercased <- makeTextUpperCaseSlowFuture(result)
numLetters <- countNumberOfLettersSlowFuture(uppercased)
} yield multiplyByTwoFast(numLetters)
defined function countNumberOfLettersSlowFuture
defined function multiplyByTwoFast
res79_2: Future[Int] = Success(26)
def functionThatThrowsErrorInFuture(inputText: String) = {
Future{
Thread.sleep(1000) // do nothing for 1 second
throw new Exception("BOOM!")
}
}
slowOperationFuture("foo")
.flatMap{
result => functionThatThrowsErrorInFuture(result)
}.map{
successfulResult => println(s"Success! ${successfulResult}")
}.recover{
case e:Exception => println(s"Error! ${e}")
}
Thread.sleep(2000)
Error! java.lang.Exception: BOOM!
defined function functionThatThrowsErrorInFuture
res86_1: Future[Unit] = Success(())