The Either
type in Scala is a powerful construct for representing computations that can result in one of two possible outcomes. It's particularly useful for error handling and expressing branching logic in a functional manner.
Either
is a sealed abstract class with two subclasses: Left
and Right
. By convention, Left
is used to represent failure or an error case, while Right
represents success or the expected result.
Here's how you can create and use an Either
type:
val result: Either[String, Int] = Right(42)
val error: Either[String, Int] = Left("An error occurred")
In this example, Either[String, Int]
means the Left
type is String
(for error messages) and the Right
type is Int
(for successful results).
You can use pattern matching to handle different cases of an Either
:
result match {
case Left(error) => println(s"Error: $error")
case Right(value) => println(s"Success: $value")
}
Either
supports map
and flatMap
operations, which work on the Right
value:
val doubled: Either[String, Int] = result.map(_ * 2)
val stringified: Either[String, String] = doubled.map(_.toString)
Either
when you need to represent two possible outcomes, especially for error handling.Either
over throwing exceptions for predictable error cases.Either
with for-comprehensions for elegant error handling in complex scenarios.Here's a practical example of using Either
for a division function that handles division by zero:
def divide(a: Int, b: Int): Either[String, Double] =
if (b == 0) Left("Division by zero")
else Right(a.toDouble / b)
// Usage
val result1 = divide(10, 2) // Right(5.0)
val result2 = divide(5, 0) // Left("Division by zero")
result1.foreach(println) // Prints: 5.0
result2.foreach(println) // Does nothing
The Either
type in Scala provides a robust way to handle computations with two possible outcomes. It's particularly useful for error handling and expressing branching logic in a functional and type-safe manner. By leveraging Either
, you can write more expressive and safer code, especially when dealing with operations that may fail.