getOrElse и fold
Извлекайте значения
«getOrElse и fold» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Получение значения
Рано или поздно Вам потребуется извлечь обычное значение из Option, указав разумную замену на случай, если получен None.
В Scala для этого предусмотрены безопасные средства извлечения, такие как getOrElse и fold.
Использование getOrElse
getOrElse возвращает значение внутри Some или заданное Вами значение по умолчанию, если получен None.
Он всегда возвращает обычное значение, а не Option.
object Main {
def main(args: Array[String]): Unit = {
val a: Option[Int] = Some(5)
val b: Option[Int] = None
println(a.getOrElse(0))
println(b.getOrElse(0))
}
}Значение по умолчанию вычисляется лениво
Значение по умолчанию в getOrElse вычисляется только тогда, когда Option равен None. Поэтому вычисление ресурсоёмкого значения по умолчанию ничего не стоит, если значение присутствует.
object Main {
def expensiveDefault(): Int = { println("computing default"); 99 }
def main(args: Array[String]): Unit = {
val present: Option[Int] = Some(7)
println(present.getOrElse(expensiveDefault()))
}
}Избегайте get
У Option есть метод get, но при None он выбрасывает исключение. Это сводит на нет смысл использования Option.
Вместо него используйте getOrElse, fold или сопоставление с образцом.
orElse для запасных вариантов Option
orElse работает иначе: он возвращает первый Option, если тот является Some, а в противном случае возвращает запасной Option.
Используйте его, чтобы пробовать альтернативы, которые сами могут оказаться пустыми.
object Main {
def main(args: Array[String]): Unit = {
val primary: Option[Int] = None
val backup: Option[Int] = Some(42)
println(primary.orElse(backup))
}
}Знакомство с fold
fold обрабатывает оба случая за один вызов. Сначала Вы передаёте значение по умолчанию для None, затем функцию для значения Some.
Метод возвращает один результат, преобразуя значение, если оно присутствует.
object Main {
def main(args: Array[String]): Unit = {
val n: Option[Int] = Some(10)
val result = n.fold(0)(x => x * 2)
println(result)
}
}fold для None
Если Option равен None, fold возвращает указанное первым значение по умолчанию и игнорирует функцию преобразования.
object Main {
def main(args: Array[String]): Unit = {
val empty: Option[Int] = None
val result = empty.fold(-1)(x => x * 2)
println(result)
}
}fold с другим типом результата
Обе ветви fold должны возвращать один и тот же тип, но этот тип может отличаться от типа значения в Option.
Здесь мы преобразуем Option[Int] в String.
object Main {
def describe(o: Option[Int]): String =
o.fold("missing")(x => s"value $x")
def main(args: Array[String]): Unit = {
println(describe(Some(8)))
println(describe(None))
}
}Как выбрать подходящий вариант
Краткое руководство:
getOrElse: предоставить значение по умолчанию того же типаorElse: предоставить запасной Optionfold: преобразовать значение и одновременно указать значение по умолчанию- сопоставление с образцом: когда для каждого случая требуется более сложная логика
Сочетание с map
Распространённый приём — сначала использовать map для преобразования, а затем getOrElse, чтобы получить обычное значение.
object Main {
def main(args: Array[String]): Unit = {
val name: Option[String] = Some("ada")
val display = name.map(_.toUpperCase).getOrElse("ANON")
println(display)
}
}Собираем всё вместе
Найдите значение конфигурации, укажите запасной Option, а затем получите значение по умолчанию с помощью getOrElse.
object Main {
val env = Map("timeout" -> "30")
def main(args: Array[String]): Unit = {
val timeout = env.get("timeout")
.flatMap(_.toIntOption)
.getOrElse(60)
println(timeout)
val retries = env.get("retries").fold(3)(_.toInt)
println(retries)
}
}Быстрая проверка
Проверьте, насколько хорошо Вы поняли извлечение значений из Option.
Повторение
Вы научились безопасно извлекать значения из Option:
getOrElse(default)возвращает значение или значение по умолчанию (вычисляемое лениво)orElse(fallback)возвращает первый Some или запасной Optionfold(default)(f)преобразует Some и задаёт значение по умолчанию для None за один шаг- Избегайте
get, который выбрасывает исключение при None
Часто задаваемые вопросы
Урок «getOrElse и fold» бесплатный?
Да — полный текст урока «getOrElse и fold» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.
Чему я научусь в уроке «getOrElse и fold»?
Извлекайте значения Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?
Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «getOrElse и fold»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?
Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Избегаем null
- map и flatMap для Option
- getOrElse и fold
- Option в for-comprehension