English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Тип Option(опция) в Scala используется для представления того, что значение может быть или отсутствовать.
Option[T] - это контейнер для可选ых значений типа T: если значение существует, Option[T] является Some[T], если значение отсутствует, Option[T] является объектом None.
Давайте рассмотрим следующий код:
// Хотя Scala может не определять тип переменной, я все же это делаю для ясности
// Определено явно
val myMap: Map[String, String] = Map("key1" -> "value")
val value1: Option[String] = myMap.get("key1")
val value2: Option[String] = myMap.get("key2")
println(value1) // Some("value1")
println(value2) // None
В上面的 коде, myMap - это хэш-карта с типом ключа String и типом значения String, но в отличие от него, метод get() возвращает категорию Option[String].
Scala использует Option[String], чтобы сказать вам: «Я постараюсь вернуть String, но возможно, что String не будет передан вам».
В myMap нет данных с ключом key2, метод get() возвращает None.
Option имеет два подкласса: Some и None. Когда он возвращает Some, это означает, что функция успешно предоставила вам строку, и вы можете получить эту строку через метод get(). Если он возвращает None, это означает, что нет строки, которую можно предоставить.
Другой пример:
object Test {
def main(args: Array[String]) {
val sites = Map("w3codebox" -> "ru.oldtoolbag.com", "google" -> "www.google.com")
println("sites.get( \"w3codebox\" ) : " + sites.get( "w3codebox" )) // Some(ru.oldtoolbag.com)
println("sites.get( \"baidu\" ) : " + sites.get( "baidu" )) // None
}
}
Выполните вышеуказанный код, результат вывода будет:
$ scalac Test.scala $ scala Test sites.get( "w3codebox" ) : Some(ru.oldtoolbag.com) sites.get( "baidu" ) : None
Вы также можете использовать шаблонное соответствие для вывода соответствующего значения. Примеры приведены ниже:
object Test {
def main(args: Array[String]) {
val sites = Map("w3codebox" -> "ru.oldtoolbag.com", "google" -> "www.google.com")
println("show(sites.get( \"w3codebox\")) : " +
show(sites.get( "w3codebox")) )
println("show(sites.get( \"baidu\")) : " +
show(sites.get( "baidu")) )
}
def show(x: Option[String]) = x match {
case Some(s) => s
case None => "?"
}
}
Выполните вышеуказанный код, результат вывода будет:
$ scalac Test.scala $ scala Test show(sites.get( "w3codebox")) : ru.oldtoolbag.com show(sites.get( "baidu")) : ?
Вы можете использовать метод getOrElse() для получения существующего элемента в кортеже или использовать его значение по умолчанию. Примеры приведены ниже:
object Test {
def main(args: Array[String]) {
val a:Option[Int] = Some(5)
val b:Option[Int] = None
println("a.getOrElse(0): " + a.getOrElse(0))
println("b.getOrElse(10): " + b.getOrElse(10))
}
}
Выполните вышеуказанный код, результат вывода будет:
$ scalac Test.scala $ scala Test a.getOrElse(0): 5 b.getOrElse(10): 10
Вы можете использовать метод isEmpty() для проверки, является ли элемент в кортеже None, пример приведен ниже:
object Test {
def main(args: Array[String]) {
val a:Option[Int] = Some(5)
val b:Option[Int] = None
println("a.isEmpty: " + a.isEmpty )
println("b.isEmpty: " + b.isEmpty )
}
}
Выполните вышеуказанный код, результат вывода будет:
$ scalac Test.scala $ scala Test a.isEmpty: false b.isEmpty: true
В таблице ниже перечислены常用 методы Scala Option:
Номер | Методы и описание |
---|---|
1 |
def get: A Получите значение опционального типа |
2 |
def isEmpty: Boolean Проверяет, является ли значение опционального типа None, если да, возвращает true, в противном случае возвращает false |
3 |
def productArity: Int Возвращает количество элементов, A(x_1, ..., x_k), возвращает k |
4 |
def productElement(n: Int): Any Получите указанную опцию, начиная с 0. То есть A(x_1, ..., x_k), верните x_(n+1), 0 < n < k. |
5 |
def exists(p: (A) => Boolean): Boolean Если в опции указан элемент, удовлетворяющий условию и не равный None, возвращает true, в противном случае возвращает false. |
6 |
def filter(p: (A) => Boolean): Option[A] Если опция содержит значение и функция условия, переданная в filter, возвращает true, filter возвращает Some пример. В противном случае, возвращается значение None . |
7 |
def filterNot(p: (A) => Boolean): Option[A] Если опция содержит значение и функция условия, переданная в filter, возвращает false, filter возвращает Some пример. В противном случае, возвращается значение None . |
8 |
def flatMap[B](f: (A) => Option[B]): Option[B] Если опция содержит значение, передается функции f для обработки и возвращается, в противном случае возвращается None |
9 |
def foreach[U](f: (A) => U): Unit Если опция содержит значение, каждый из значений передается функции f, в противном случае не обрабатывается. |
10 |
def getOrElse[B >: A](default: => B): B Если опция содержит значение, возвращается значение опции, в противном случае возвращается заданное значение по умолчанию. |
11 |
def isDefined: Boolean Если опция содержит значение, возвращается true, в противном случае возвращается false. |
12 |
def iterator: Iterator[A] Если опция содержит значение, выполняется итерация по значению. Если опция пуста, возвращается пустой итератор. |
13 |
def map[B](f: (A) => B): Option[B] Если опция содержит значение, возвращается Some, обработанный функцией f, в противном случае возвращается None |
14 |
def orElse[B >: A](alternative: => Option[B]): Option[B] Если Option равен None, метод orElse возвращает значение параметра Transmission, в противном случае возвращает этот Option. |
15 |
def orNull Если опция содержит значение, возвращается значение опции, в противном случае возвращается null. |