English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Scala Option(опция)

Коллекции Scala

Тип 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()

Вы можете использовать метод 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()

Вы можете использовать метод 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

В таблице ниже перечислены常用 методы 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.

Коллекции Scala