English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
O tipo Option (opção) do Scala é usado para representar um valor opcional (com valor ou sem valor).
Option[T] é um contêiner de valor opcional do tipo T: se o valor existir, Option[T] é um Some[T], se não existir, Option[T] é o objeto None .
Vamos analisar um trecho de código a seguir:
// Embora o Scala possa não definir o tipo de variável, ainda assim, para maior clareza, eu ainda
// definiu-o explicitamente
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
No código acima, myMap é um hash map do tipo String para String, mas o que difere é que seu método get() retorna um tipo chamado Option[String].
Scala usa Option[String] para informar: 'Vou tentar retornar um String, mas pode não ter String para retornar'.
Não há chave no myMap2 Este dado, o método get() retorna None.
Option tem dois subtipos, um é Some e o outro é None, quando ele retorna Some, isso significa que a função foi bem-sucedida em fornecer um String, e você pode obter esse String através do método get(), se ele retornar None, isso significa que não há String para fornecer.
Outro exemplo:
object Test {
def main(args: Array[String]) {
val sites = Map#40;"w3codebox" -> "pt.oldtoolbag.com", "google" -> "www.google.com"#41;
println+codebox\ + 0;sites.get#40; "w3codebox" #41;) // 3codebox.com)
println("sites.get( \ + 0;sites.get#40; "baidu" #41;) // None
}
}
Executar o código acima, o resultado de saída será:
$ scalac Test.scala $ scala Test sites.get( "w3codebox" ) : Some(pt.oldtoolbag.com) sites.get( "baidu" ) : None
Você também pode usar correspondência de padrão para exibir o valor correspondente. Veja o exemplo a seguir:
object Test {
def main(args: Array[String]) {
val sites = Map#40;"w3codebox" -> "pt.oldtoolbag.com", "google" -> "www.google.com"#41;
println+codebox\ +
show#40;sites.get#40; "w341;) )
println("show(sites.get( \ +
show#40;sites.get#40; "baidu"#41;) )
}
def show#40;x: Option#91;String]) = x match #123;
case Some#40;s#41; => s
case None => "?"
}
}
Executar o código acima, o resultado de saída será:
$ scalac Test.scala $ scala Test show(sites.get( "w3codebox")) : pt.oldtoolbag.com show(sites.get( "baidu")) : ?
Você pode usar o método getOrElse() para obter o elemento existente no tupla ou usar seu valor padrão, veja o exemplo a seguir:
object Test {
def main(args: Array[String]) {
val a:Option[Int] = Some(5)
val b:Option[Int] = None
println("a.getOrElse(0): " + a.getOrElse40;0#41; )
println("b.getOrElse(10): " + b.getOrElse40;10) )
}
}
Executar o código acima, o resultado de saída será:
$ scalac Test.scala $ scala Test a.getOrElse(0): 5 b.getOrElse(10): 10
Você pode usar o método isEmpty() para detectar se o elemento do tuplo é None, exemplo a seguir:
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 )
}
}
Executar o código acima, o resultado de saída será:
$ scalac Test.scala $ scala Test a.isEmpty: false b.isEmpty: true
A tabela a seguir lista os métodos comuns do Scala Option:
Número | Métodos e descrição |
---|---|
1 |
def get: A Obter o valor opcional |
2 |
def isEmpty: Boolean Detecta se o valor do tipo opcional é None, se for, retorna true, caso contrário, retorna false |
3 |
def productArity: Int Retorna o número de elementos, A(x_1, ..., x_k), retorna k |
4 |
def productElement(n: Int): Any Obter a opção especificada, começando com 0. Ou seja, A(x_1, ..., x_k), retorna x_(n+1) , 0 < n < k. |
5 |
def exists(p: (A) => Boolean): Boolean Se o elemento especificado na opção existir e não for None, retornará true, caso contrário, retornará false. |
6 |
def filter(p: (A) => Boolean): Option[A] Se a opção contiver um valor e a função de condição passada para o filter retornar true, o filter retornará Some exemplo. Caso contrário, o valor retornado será None. |
7 |
def filterNot(p: (A) => Boolean): Option[A] Se a opção contiver um valor e a função de condição passada para o filter retornar false, o filter retornará Some exemplo. Caso contrário, o valor retornado será None. |
8 |
def flatMap[B](f: (A) => Option[B]): Option[B] Se a opção contiver um valor, é passado para a função f para processamento e retornado, caso contrário, retorna None |
9 |
def foreach[U](f: (A) => U): Unit Se a opção contiver um valor, cada valor será passado para a função f, caso contrário, não será tratado. |
10 |
def getOrElse[B >: A](default: => B): B Se a opção contiver um valor, retorna o valor da opção, caso contrário, retorna o valor padrão definido. |
11 |
def isDefined: Boolean Se o valor opcional for um exemplo de Some, retorna true, caso contrário, retorna false. |
12 |
def iterator: Iterator[A] Se a opção contiver um valor, itera sobre o valor opcional. Se o valor opcional estiver vazio, retorna um iterador vazio. |
13 |
def map[B](f: (A) => B): Option[B] Se a opção contiver um valor, retorna Some processado pela função f, caso contrário, retorna None |
14 |
def orElse[B >: A](alternative: => Option[B]): Option[B] Se uma Option for None, o método orElse retornará o valor do parâmetro nomeado, caso contrário, retornará diretamente essa Option. |
15 |
def orNull Se a opção contiver um valor, retorna o valor da opção, caso contrário, retorna null. |