Usar nulls no es una Option

Este blog va dedicado a todas aquellas personas que odian los nulls.
¿Por qué existen los NullsPointerException? ¿Por qué tenemos que trabajar con nulls?
¿Por qué? O como diría Mou: ¿Pug qué?

nlY1Wxv
Señores, los programadores de Scala somos unos haters de los nulls. Nosotros trabajamos con el tipo Option 🙂

¿Qué es un Option?

Un Option es un tipo parametrizado que puede tener dos posibles valores:

  • Some(T)
  • None

Por ejemplo, un Option[Int] puede ser Some(1), Some(123456), None…

¿Y qué tiene que ver esto con los nulls?

Podemos encapsular los nulls en Option, de manera que en vez de trabajar directamente con nulls, trabajamos con un tipo preparado para devolver valor nulos.

Option(null) === None

No más explosiones de punteros a null o comprobaciones del tipo if myValue == null.

nlY1Wxv

Imaginemos el típico método que devuelve un valor de un mapa:

val m = 
  Map(
    1 -> "el breikin dance", 
    2 -> "el crusaito", 
    3 -> "el maikel jacson", 
    4 -> "el robocó"
  )

Si no trabajasemos con Option tendríamos que comprobar si una clave existe antes de pedir su valor.

if(m.contains(1))
  println("El paso de baile es: " + m(1))
else
  println("No existe ese paso de baile")

Sin embargo, podemos pedirle al mapa que nos devuelva el valor directamente en un Option, y en caso de que no exista, este Option será None.

m.get(1) //Devolverá Some("el breikin dance")
m.get(5) //Devolverá None

¿Cómo se trabaja con el tipo Option?

Existen varias formas de trabajar con esta estructura tan maja.

Existe el método getOrElse. Este método devolverá el valor del Option (en caso de ser un Some) o bien devolverá lo que le pasemos como argumento a este método.
Un ejemplos sencillo:

m.get(1).getOrElse("Paquito el chocolatero")

Otra posibilidad es utilizar Pattern Matching:

m.get(1) match {
  case Some(danceStep) => 
    println("Soy el amo de la pista bailando: " + danceStep)
  case None =>
    println("Soy de los que me quedo mirando en la barra")
}

También es posible utilizar el método fold. El método fold, a diferencia del método getOrElse (y al igual que el pattern matching), permite aplicar alguna función al método devuelto. El primer argumento de la función (llamado ifEmpty) recibirá el resultado que se devolverá en caso de que el Option sea None. El segundo argumento recibe una función, la cual definiremos para saber que resultado devolver en caso de que el Option tenga un valor.

m.get(1).fold(
  ifEmpty = println("A mi lo de bailar no me va mucho")){
  step => println(s"Me rompí la cadera bailando $step")
}

Y para los functional lovers (un saludo para ellos), no hay que olvidar que un Option es una mónada y podemos hacer transformaciones, por ejemplo con map, flatmaps o, aplicando un poco de azucar sintáctico, for comprehension:

for {
  first <- m.get(1)
  second <- m.get(2)
} yield s"Empiezo con $first y termino con $second"

Existen otras estructuras parecidas de las que hablaremos en futuros posts: Either, Try … pero tiempo al tiempo.

Así que, recuerda: Si usas Option los niños sonríen, los pajarillos cantan y los nulls desaparecen 🙂

nlY1Wxv

Anuncios

3 thoughts on “Usar nulls no es una Option

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s