Преобразование между типами
Option, Either, Try
«Преобразование между типами» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Три модели ошибок
Scala предлагает три взаимодополняющих типа для представления отсутствия значения и ошибок:
Option— наличие или отсутствие значения (без объяснения причины).Either— успешный результат или типизированная ошибка.Try— успешный результат или выброшенное исключение.
Умение преобразовывать их друг в друга позволяет адаптировать один программный интерфейс к другому.
Преобразование Option в Either
toRight преобразует Option в Either, подставляя ошибку Left для случая None. toLeft выполняет обратное преобразование.
@main def run(): Unit = {
val some: Option[Int] = Some(5)
val none: Option[Int] = None
println(some.toRight("missing"))
println(none.toRight("missing"))
}Either в Option
toOption отбрасывает ошибку: Right(x) превращается в Some(x), а Left(_) — в None. Используйте этот метод, когда причина сбоя больше не важна.
@main def run(): Unit = {
val r: Either[String, Int] = Right(42)
val l: Either[String, Int] = Left("err")
println(r.toOption)
println(l.toOption)
}Try в Option
Try.toOption преобразует Success в Some, а Failure — в None, скрывая исключение.
import scala.util.Try
@main def run(): Unit = {
println(Try("7".toInt).toOption)
println(Try("x".toInt).toOption)
}Try в Either
Try.toEither создаёт Either[Throwable, T]: Success превращается в Right, а Failure — в Left(throwable). При этом исключение сохраняется как типизированное левое значение.
import scala.util.Try
@main def run(): Unit = {
val ok = Try("7".toInt).toEither
val no = Try("x".toInt).toEither
println(ok)
println(no.left.map(_.getMessage))
}Either в Try
Для преобразования Either в Try с обычной ошибкой нет готового встроенного метода, но его можно создать самостоятельно: обернуть Right в Success, а Left — в Failure, содержащий исключение.
import scala.util.{Try, Success, Failure}
object Main {
def toTry(e: Either[String, Int]): Try[Int] = e match {
case Right(v) => Success(v)
case Left(m) => Failure(new RuntimeException(m))
}
def main(args: Array[String]): Unit = {
println(toTry(Right(1)))
println(toTry(Left("bad")))
}
}Option в Try
Преобразуйте Option в Try, выбрав исключение для пустого случая. Это полезно, когда программный интерфейс ожидает значение типа Try.
import scala.util.{Try, Success, Failure}
object Main {
def toTry[A](o: Option[A]): Try[A] = o match {
case Some(v) => Success(v)
case None => Failure(new NoSuchElementException("empty"))
}
def main(args: Array[String]): Unit = {
println(toTry(Some(9)))
println(toTry(None))
}
}Нормализация конвейера
Смешивание типов создаёт сложности. Распространённый подход — на раннем этапе преобразовать всё в Either с единым типом ошибки, а затем свободно комбинировать значения.
import scala.util.Try
object Main {
def parse(s: String): Either[String, Int] =
Try(s.toInt).toEither.left.map(_ => s"invalid: $s")
def lookup(n: Int): Either[String, String] =
Map(1 -> "one", 2 -> "two").get(n).toRight(s"no entry for $n")
def main(args: Array[String]): Unit = {
val result = for {
n <- parse("2")
w <- lookup(n)
} yield w
println(result)
}
}getOrElse для разных типов
Все три типа поддерживают getOrElse, который извлекает значение или подставляет значение по умолчанию. Часто это последний шаг, завершающий обработку ошибок.
import scala.util.Try
@main def run(): Unit = {
val a = Some(1).getOrElse(0)
val b = (Right(2): Either[String, Int]).getOrElse(0)
val c = Try("x".toInt).getOrElse(0)
println(s"$a $b $c")
}Выбор подходящего типа
Рекомендации:
- Используйте Option, когда отсутствие значения не требует объяснения.
- Используйте Either, когда нужно представить ошибку значением, специфичным для предметной области.
- Используйте Try на границах системы, где вызывается код Java или библиотек, выбрасывающий исключения.
Сквозной пример
Чтение кода, выбрасывающего исключения, с помощью Try, преобразование в Either для обработки ошибок предметной области и, наконец, в Option для вызывающего кода, которому важно только наличие значения.
import scala.util.Try
object Main {
def safeDiv(a: Int, b: Int): Option[Int] =
Try(a / b).toEither.left.map(_ => "math error").toOption
def main(args: Array[String]): Unit = {
println(safeDiv(10, 2))
println(safeDiv(10, 0))
}
}Быстрая проверка
Проверьте, насколько хорошо Вы умеете выполнять преобразования.
Итоги
Вы научились преобразовывать Option, Either и Try друг в друга:
Option.toRight→ Either;Either.toOption→ Option.Try.toOptionиTry.toEitherсвязывают исключения со значениями.- Заранее нормализуйте конвейер, приведя его к одному типу ошибки.
- Выбирайте тип в зависимости от необходимой детализации ошибки.
Часто задаваемые вопросы
Урок «Преобразование между типами» бесплатный?
Да — полный текст урока «Преобразование между типами» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Чему я научусь в уроке «Преобразование между типами»?
Option, Either, Try Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?
Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Преобразование между типами»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?
Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Either для ошибок
- Try, Success, Failure
- Композиция Either
- Преобразование между типами