Translate

viernes, 17 de febrero de 2017

Un resumen de Scala for the Impatient, parte 9

Interoperabilidad con Java

Los arreglos de scala fueron implementados como los arreglos de java por lo tanto podemos pasar de uno a otro.

Si necesitamos llamar a un método java que retorna un java.util.List podemos hacerlo y utilizar java.util.ArrayList. Pero es mejor utilizar colecciones de scala, por lo tanto podemos utilizar una convercion implicita, importando scala.collection.JavaConversions luego podemos utilizar ArrayBuffer de scala.

Por ejemplo java.lang.ProcessBuilder necesita una lista de parametros de tipo List<String> por lo tanto podemos hacer lo siguiente:

import scala.collection.JavaConversions.bufferAsJavaList
import scala.collection.mutable.ArrayBuffer

val command = ArrayBuffer("ls", "-al", "/home/cay")
val pb = new ProcessBuilder(command) // Scala a Java

De igual manera podemos pasar de una lista de Java a un buffer de Scala:

import scala.collection.JavaConversions.asScalaBuffer
import scala.collection.mutable.Buffer

val cmd : Buffer[String] = pb.command() // Java to Scala

Construyendo un mapa

Empecemos por el principio un mapa es una estructura que permite acceder a elementos por medio de una llave o key. Por lo tanto debemos insertar tanto el valor como la key.

Podemos crear un mapa de forma declarativa:

val scores = Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)

De esta forma se creea un mapa inmutable. Si esperamos hacer un map mutable debemos hacerlo de la siguiente manera:

val scores = scala.collection.mutable.Map("Alice" -> 10, "Bob" -> 3, "Cindy" -> 8)

Si necesitamos iniciar un mapa vacio, debemos indicar el tipo:

val scores = new scala.collection.mutable.HashMap[String, Int]

En Scala un map no es mas que una colección de pares. El operador -> crea los pares. Por ejemplo:

"Alice" -> 10 es ("Alice", 10)

Por lo tanto podemos definir un mapa de la siguiente manera:

val scores = Map(("Alice", 10), ("Bob", 3), ("Cindy", 8))
El operador -> es un poco amigable que los paréntesis.

Acceder a los valores del mapa: 

En Scala podemos acceder a los valores con los parentesis:

val bobsScore = scores("Bob") // Como scores.get("Bob") en Java

Si el mapa no contiene el valor para una key, se lanza una excepción.

val bobsScore = if (scores.contains("Bob")) scores("Bob") else 0

Podemos utilizar la función getOrElse para hacer algo similar:

val bobsScore = scores.getOrElse("Bob", 0)

Por ultimo podemos acceder al elemento por medio del método get que retorna un Option objeto que puede ser Some o None. Que vamos a explicarlo más adelante.