Saltar al contenido

Scala – Opciones

octubre 21, 2021

Opción Scala[ T ] es un contenedor para cero o un elemento de un tipo determinado. Una opción[T] pueden ser cualquiera de los dos Algunos[T] o Ninguno objeto, que representa un valor perdido. Por ejemplo, el método get de Scala’s Map produce Some (valor) si se ha encontrado un valor correspondiente a una clave determinada, o Ninguno si la clave dada no está definida en el Mapa.

El tipo de opción se usa con frecuencia en los programas Scala y puede compararlo con el nulo valor disponible en Java que no indica ningún valor. Por ejemplo, el método get de java.util.HashMap devuelve un valor almacenado en HashMap o un valor nulo si no se encontró ningún valor.

Digamos que tenemos un método que recupera un registro de la base de datos basado en una clave primaria.

def findPerson(key: Int): Option[Person]

El método devolverá algunos[Person] si se encuentra el registro, pero Ninguno si no se encuentra el registro. Sigamos el siguiente programa.

Ejemplo

object Demo {
   def main(args: Array[String]) {
      val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
      
      println("capitals.get( "France" ) : " +  capitals.get( "France" ))
      println("capitals.get( "India" ) : " +  capitals.get( "India" ))
   }
}

Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.

Mando

>scalac Demo.scala
>scala Demo

Producción

capitals.get( "France" ) : Some(Paris)
capitals.get( "India" ) : None

La forma más común de separar los valores opcionales es mediante una coincidencia de patrones. Por ejemplo, pruebe el siguiente programa.

Ejemplo

object Demo {
   def main(args: Array[String]) {
      val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
      
      println("show(capitals.get( "Japan")) : " + show(capitals.get( "Japan")) )
      println("show(capitals.get( "India")) : " + show(capitals.get( "India")) )
   }
   
   def show(x: Option[String]) = x match {
      case Some(s) => s
      case None => "?"
   }
}

Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.

Mando

>scalac Demo.scala
>scala Demo

Producción

show(capitals.get( "Japan")) : Tokyo
show(capitals.get( "India")) : ?

Usando el método getOrElse ()

A continuación se muestra el programa de ejemplo para mostrar cómo usar el método getOrElse () para acceder a un valor o un valor predeterminado cuando no hay ningún valor presente.

Ejemplo

object Demo {
   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) )
   }
}

Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.

Mando

>scalac Demo.scala
>scala Demo

Producción

a.getOrElse(0): 5
b.getOrElse(10): 10

Usando el método isEmpty ()

A continuación se muestra el programa de ejemplo para mostrar cómo usar el método isEmpty () para verificar si la opción es Ninguna o no.

Ejemplo

object Demo {
   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 )
   }
}

Guarde el programa anterior en Demo.scala. Los siguientes comandos se utilizan para compilar y ejecutar este programa.

Mando

>scalac Demo.scala
>scala Demo

Ejemplo

a.isEmpty: false
b.isEmpty: true

Métodos de opciones de Scala

A continuación se muestran los métodos importantes que puede utilizar mientras juega con Opciones. Para obtener una lista completa de los métodos disponibles, consulte la documentación oficial de Scala.

No Señor Métodos con descripción
1

def get: A

Devuelve el valor de la opción.

2

def isEmpty: booleano

Devuelve verdadero si la opción es Ninguna, falso en caso contrario.

3

def productArity: Int

El tamaño de este producto. Para un producto A (x_1, …, x_k), devuelve k

4

def productElement (n: Int): Cualquiera

El enésimo elemento de este producto, basado en 0. En otras palabras, para un producto A (x_1, …, x_k), devuelve x_ (n + 1) donde 0

5

def existe (p: (A) => Booleano): Booleano

Devuelve verdadero si esta opción no está vacía y el predicado p devuelve verdadero cuando se aplica al valor de esta opción. De lo contrario, devuelve falso.

6

def filter (p: (A) => Boolean): Opción[A]

Devuelve esta opción si no está vacía y la aplicación del predicado p al valor de esta opción devuelve verdadero. De lo contrario, devuelva Ninguno.

7

def filterNot (p: (A) => Boolean): Opción[A]

Devuelve esta opción si no está vacía y la aplicación del predicado p al valor de esta opción devuelve falso. De lo contrario, devuelva Ninguno.

8

def flatMap[B](f: (A) => Opción[B]): Opción[B]

Devuelve el resultado de aplicar f al valor de esta opción si esta opción no está vacía. Devuelve Ninguno si esta opción está vacía.

9

def foreach[U](f: (A) => U): Unidad

Aplique el procedimiento dado f al valor de la opción, si no está vacía. De lo contrario, no haga nada.

10

def getOrElse[B >: A](predeterminado: => B): B

Devuelve el valor de la opción si la opción no está vacía; de lo contrario, devuelve el resultado de evaluar el valor predeterminado.

11

def isDefined: booleano

Devuelve verdadero si la opción es una instancia de Some, falso en caso contrario.

12

def iterador: iterador[A]

Devuelve un iterador singleton que devuelve el valor de la opción si no está vacío, o un iterador vacío si la opción está vacía.

13

def mapa[B](f: (A) => B): Opción[B]

Devuelve Some que contiene el resultado de aplicar f al valor de esta opción si esta opción no está vacía. De lo contrario, devuelva Ninguno.

14

def orElse[B >: A](alternativa: => Opción[B]): Opción[B]

Devuelve esta opción si no está vacía; de lo contrario, devuelve el resultado de evaluar la alternativa.

15

def orNull

Devuelve el valor de la opción si no está vacía o nulo si está vacía.

scala_collections.htm

close