En la programación, las colecciones son estructuras de datos que contienen varios elementos. En Scala, las colecciones son representadas por las clases de la biblioteca estándar, que proporcionan una variedad de operaciones para trabajar con datos de colección. En este artículo, exploraremos los diferentes tipos de colecciones en Scala y cómo usarlos.
Scala tiene tres tipos principales de colecciones:
- Colecciones secuenciales
- Colecciones de conjuntos
- Colecciones de mapas
Cada uno de estos tipos de colecciones tiene sus propias clases y métodos. A continuación, veremos algunos ejemplos de cómo trabajar con cada uno de ellos.
1. Colecciones secuenciales
Las colecciones secuenciales en Scala son aquellas que tienen un orden definido para sus elementos. Las dos clases principales de colecciones secuenciales son List y Vector.
List es una colección inmutable y es implementada como una estructura de datos enlazada. Cada elemento en la lista tiene un puntero al siguiente elemento en la lista. Aquí hay un ejemplo de cómo crear una lista en Scala:
val myList = List(1, 2, 3, 4, 5)
Vector, por otro lado, es una colección mutable y es implementada como un arreglo de tamaño variable. Aquí hay un ejemplo de cómo crear un vector en Scala:
val myVector = Vector(1, 2, 3, 4, 5)
2. Colecciones de conjuntos
Las colecciones de conjuntos en Scala son aquellas que no tienen un orden definido para sus elementos y no permiten duplicados. Las dos clases principales de colecciones de conjuntos son Set y HashSet.
Set es una colección inmutable y es implementada como una tabla hash. Aquí hay un ejemplo de cómo crear un conjunto en Scala:
val mySet = Set(1, 2, 3, 4, 5)
HashSet, por otro lado, es una colección mutable y es implementada como una tabla hash también. Aquí hay un ejemplo de cómo crear un HashSet en Scala:
val myHashSet = HashSet(1, 2, 3, 4, 5)
3. Colecciones de mapas
Las colecciones de mapas en Scala son aquellas que almacenan elementos en pares clave-valor. Las dos clases principales de colecciones de mapas son Map y HashMap.
Map es una colección inmutable y es implementada como una tabla hash. Aquí hay un ejemplo de cómo crear un mapa en Scala:
val myMap = Map("key1" -> "value1", "key2" -> "value2", "key3" -> "value3")
HashMap, por otro lado, es una colección mutable y es implementada como una tabla hash también. Aquí hay un ejemplo de cómo crear un HashMap en Scala:
val myHashMap = HashMap("key1" -> "value1", "key2" -> "value2", "key3" -> "value3")
Además de estas colecciones, Scala también proporciona colecciones especiales como Tuple
, Range
, Stream
y ArrayBuffer
.
Conceptos importantes
Transformaciones en colecciones: Las colecciones en Scala son inmutables por defecto, lo que significa que una vez creadas, no se pueden modificar. En su lugar, se deben crear nuevas colecciones a través de transformaciones, que aplican una función a cada elemento de la colección y producen una nueva colección. Algunas transformaciones comunes son map, filter y flatMap.
Operaciones de reducción: Las operaciones de reducción se utilizan para reducir una colección a un solo valor. Algunas operaciones de reducción comunes son foldLeft, foldRight, reduceLeft y reduceRight. Estas operaciones toman una función binaria que se utiliza para combinar elementos de la colección en un solo valor.
Agrupamiento: Las colecciones se pueden agrupar en mapas utilizando el método groupBy. Este método toma una función que se utiliza para determinar la clave de cada elemento y devuelve un mapa cuyas claves son los valores devueltos por la función y cuyos valores son las listas de elementos que tienen esa clave.
Ordenación: Las colecciones se pueden ordenar mediante el método sorted. Este método devuelve una nueva colección ordenada según un criterio específico. También se pueden utilizar los métodos sortBy y sortWith para ordenar colecciones según otros criterios.
Iteración: Las colecciones se pueden iterar utilizando los métodos foreach y for. El método foreach toma una función que se aplica a cada elemento de la colección, mientras que la estructura for se puede utilizar para iterar sobre una colección de forma similar a un bucle for en otros lenguajes.
Aquí hay un ejemplo que combina varios de estos conceptos:
val numbers = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
// Transformaciones
val squares = numbers.map(n => n * n)
val evens = numbers.filter(n => n % 2 == 0)
val flatMapExample = numbers.flatMap(n => List(n, n * n))
// Operaciones de reducción
val sum = numbers.foldLeft(0)(_ + _)
val product = numbers.foldLeft(1)(_ * _)
val max = numbers.reduceLeft((a, b) => if (a > b) a else b)
// Agrupamiento
val words = List("apple", "banana", "cherry", "date", "elderberry")
val byFirstLetter = words.groupBy(_.charAt(0))
// Ordenación
val descending = numbers.sorted.reverse
val byStringLength = words.sortBy(_.length)
val byLastLetter = words.sortWith((a, b) => a.last > b.last)
// Iteración
numbers.foreach(n => println(n))
for (n <- numbers) {
println(n)
}
En este ejemplo, se crea una lista de números y se utilizan transformaciones como map
, filter
y flatMap
para crear nuevas colecciones a partir de ella. Luego, se utilizan operaciones de reducción como foldLeft
y reduceLeft
para calcular valores agregados a partir de la lista original. También se utiliza el método groupBy
para agrupar una lista de palabras en un mapa, y los métodos sorted
, sortBy
y sortWith
para ordenar las colecciones de diversas maneras. Finalmente, se utilizan los métodos foreach
y for
para iterar sobre las colecciones.