Scala Futures and Concurrency

Futures represent values that may not be available yet.

Creating a Future

Scala
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

val future: Future[String] = Future {
  Thread.sleep(1000)
  "Hello from the future!"
}

Handling Results

Scala
future.onComplete {
  case scala.util.Success(value) => println(s"Result: $value")
  case scala.util.Failure(error) => println(s"Error: ${error.getMessage}")
}

For-Comprehensions

Scala
val result: Future[String] = for {
  user <- fetchUser(id)
  posts <- fetchPosts(user.id)
} yield s"${user.name} has ${posts.size} posts"

Parallel Composition

Scala
val userF = Future { fetchUser(1) }
val orderF = Future { fetchOrder(2) }
val combined: Future[(User, Order)] = userF.zip(orderF)

Tips

  • Use Future for I/O-bound operations.
  • Prefer for-comprehensions for readability.
  • Always provide an ExecutionContext.

🎉 You have completed the Scala course!