martes, 28 de febrero de 2017

Un resumen de Scala for the Impatient, parte 11

Mapas Ordenados

Cuando se trabaja con un mapa, es necesario elegir una implementación: un hash o un árbol balanceado. De forma predeterminada, Scala le ofrece una tabla hash. Es posible que debamos usar  un mapa implementado con un árbol.
Scala tiene un mapa inmutable ordenado implementado con un árbol:

val scores = scala.collection.immutable.SortedMap("Alice" -> 10, "Fred" -> 7, "Bob" -> 3, "Cindy" -> 8)

Desafortunadamente en scala 2.9 no tiene un mapa mutable implementado con un árbol. Lo que podemos hacer es usar el TreeMap de java.

Podemos utilizar un mapa de Java y luego podemos convertirlo en un mapa de scala. Para convertir a un mapa de scala debemos importar : scala.collection.JavaConversions.mapAsScalaMap

Podemos cambiar tipo de mapa de la siguiente :

val scores: scala.collection.mutable.Map[String, Int] = new java.util.TreeMap[String, Int]

Además, puede obtener una conversión de java.util.Properties a un Map [String, String] :

import scala.collection.JavaConversions.propertiesAsScalaMap
val props: scala.collection.Map[String, String] = System.getProperties()

Por el contrario, para pasar un mapa Scala a un método que espera un mapa Java, proporcione la conversión implícita opuesta. Por ejemplo:

import scala.collection.JavaConversions.mapAsJavaMap
import java.awt.font.TextAttribute._ // Importar la librería
val attrs = Map(FAMILY -> "Serif", SIZE -> 12) // Un mapa de Scala
val font = new java.awt.Font(attrs) // Retorna un mapa Java

Tuplas

Un mapa esta formado por una clave/valor que básicamente es una tupla.
Una tupla son un conjunto de valores que pueden ser de diferente tipo:

(1, 3.14, "Fred")

Y el tipo de esta tupla es : Tuple3[Int, Double, java.lang.String] lo cual podemos escribir así: (Int, Double, java.lang.String) o podemos dejar que el tipo sea inferido:

val t = (1, 3.14, "Fred")

Podemos acceder a los valores por medio que los metodos _1, _2, _3 :

 val second = t._2 // Asigna 3.14 a second

A diferencia de los arreglos estos métodos comienzan con el _1 pero es más fácil usar pattern matching para asignar:

val (first, second, third) = t // Esto asigna a first el valor 1 y a second 2.14 y a third el valor “Fred”

Podemos utilizar el _ para los casos que no necesitamos guardar un valor en una variable:

val (first, second, _) = t

Las tuplas son útiles para funciones que retornan más de un valor. Por ejemplo partition de StringOps:

"New York".partition(_.isUpper) // retorna la tupla ("NY", "ew ork")