Colecciones y Colecciones Inmutables
El sistema de colecciones de Scala es una parte integral del lenguaje, diseñado para ser versátil, eficiente y fácil de usar. Incluye una amplia variedad de colecciones mutables e inmutables, adecuadas tanto para la programación funcional como orientada a objetos.
Tipos de Colecciones
Scala proporciona dos tipos principales de colecciones:
Colecciones Mutables: Permiten cambiar su contenido después de su creación.
- Ejemplo:
ArrayBuffer,ListBuffer,HashMap.
- Ejemplo:
Colecciones Inmutables: Su contenido no puede modificarse después de su creación. Se prefieren en la programación funcional.
- Ejemplo:
List,Vector,Map.
- Ejemplo:
Por defecto, las colecciones de Scala son inmutables. Puedes importar las versiones mutables si lo necesitas:
import scala.collection.mutableListas
Listas Inmutables
Las listas inmutables (List) son las más comunes en Scala y representan una secuencia enlazada de elementos.
Ejemplo:
val numeros = List(1, 2, 3, 4, 5)
println(numeros.head) // Primer elemento: 1
println(numeros.tail) // Resto de la lista: List(2, 3, 4, 5)Las listas soportan operaciones funcionales como map, filter y reduce:
val cuadrados = numeros.map(x => x * x)
println(cuadrados) // Salida: List(1, 4, 9, 16, 25)Listas Mutables
Puedes usar ListBuffer para trabajar con listas mutables:
import scala.collection.mutable.ListBuffer
val buffer = ListBuffer(1, 2, 3)
buffer += 4
println(buffer) // Salida: ListBuffer(1, 2, 3, 4)Conjuntos (Set)
Los conjuntos son colecciones que no permiten elementos duplicados.
Conjuntos Inmutables
val conjunto = Set(1, 2, 3, 3)
println(conjunto) // Salida: Set(1, 2, 3)Conjuntos Mutables
import scala.collection.mutable
val conjuntoMutable = mutable.Set(1, 2, 3)
conjuntoMutable += 4
println(conjuntoMutable) // Salida: Set(1, 2, 3, 4)Mapas (Map)
Los mapas almacenan pares clave-valor y pueden ser mutables o inmutables.
Mapas Inmutables
val mapa = Map("a" -> 1, "b" -> 2, "c" -> 3)
println(mapa("a")) // Salida: 1Mapas Mutables
import scala.collection.mutable
val mapaMutable = mutable.Map("a" -> 1, "b" -> 2)
mapaMutable("c") = 3
println(mapaMutable) // Salida: Map(a -> 1, b -> 2, c -> 3)Arrays
Los arrays son colecciones mutables de tamaño fijo.
val array = Array(1, 2, 3, 4, 5)
array(0) = 10
println(array.mkString(", ")) // Salida: 10, 2, 3, 4, 5Operaciones Comunes con Colecciones
Mapear y Transformar
val numeros = List(1, 2, 3)
val dobles = numeros.map(_ * 2)
println(dobles) // Salida: List(2, 4, 6)Filtrar
val pares = numeros.filter(_ % 2 == 0)
println(pares) // Salida: List(2)Reducción
val suma = numeros.reduce(_ + _)
println(suma) // Salida: 6Agrupar
val agrupados = numeros.groupBy(_ % 2 == 0)
println(agrupados) // Salida: Map(false -> List(1, 3), true -> List(2))Ventajas de las Colecciones Inmutables
- Seguridad en concurrencia: No se modifican en tiempo de ejecución, evitando errores por acceso concurrente.
- Predictibilidad: El estado no cambia, lo que facilita el razonamiento sobre el código.
- Optimización: Scala utiliza estructuras de datos compartidas para minimizar la sobrecarga de crear nuevas colecciones.
Buenas Prácticas
- Prefiere inmutabilidad: Usa colecciones inmutables a menos que sea absolutamente necesario modificar el contenido.
- Evita copiar datos grandes: Aprovecha las características compartidas de las colecciones inmutables.
- Usa operaciones funcionales: Métodos como
map,filteryreducemejoran la claridad y expresividad del código.
Conclusión
El sistema de colecciones de Scala ofrece herramientas poderosas para manejar datos de manera eficiente y funcional. Entender la diferencia entre colecciones mutables e inmutables, y aprovechar las operaciones funcionales, es clave para escribir código escalable y mantenible.
