IndexSeq, LinearSeq, Head y Tail en Scala.

En este post te voy a explicar los conceptos: IndexSeq, LinearSeq, tail y head. Y como te sirven cuando trabajas con colecciones en Scala.

 

En Scala todas las colecciones implementan el Trait Seq, que sería el equivalente a IEnumerable en C# o Iterable en Java. Después, existen dos implementaciones de colecciones, IndexSeq y LinearSeq.  Cada una de estas implementaciones tiene ciertas optimizaciones dependiendo de lo que necesites.

IndexSeq.

En el caso de IndexSeq, el acceso a elementos aleatorios es más eficiente, ¿qué significa esto?, que colecciones como Vector, Range, NumericRange, Array o String trabajan mejor en escenarios donde tienes acceder a los elementos de estas mediante «[ ]». Las operaciones de actualización y  obtención de tamaño (length), también son más eficientes en las implementaciones de IndexSeq.

 

LinearSeq.

Las colecciones que implementan LinearSeq tiene mejor rendimiento cuando necesitas acceder a la cabeza o cola de la agrupación. Si trabajas con colas, pilas, buffers o cualquier elemento donde la secuencia de los elementos sea relevante, te conviene usar una agrupación que herede de LinearSeq.

 

Tail y Head.

Tail y head son partes conceptuales de la colección. Head o la cabeza es el primer elemento de la colección. Y Tail o la cola son todos los elementos restantes. Tanto tail como head pueden ser Nil si la colección no tiene elementos suficientes.

Seq vs LinearSeq vs IndexSeq.

Si no requieres de una optimización en particular para trabajar con colecciones, entonces, puedes utilizar Seq como tipo para tus variables y parámetros. En cambio, si requieres un mejor desempeño de acuerdo al contexto con el que trabajas, puedes optar por IndexSeq o LinearSeq.

Puedes acceder a los elementos tail y head de un IndexSeq. Y también, a los elementos vía índice de un LinearSeq.

Vector.

Vector es un caso especial, es una colección que tiene un desempeño razonable tanto en acceso linear como acceso por índice. En el caso de que requieras trabajar con un componente en el que se acceda por índice y también se ejecuten operaciones sobre los últimos elementos agregados, bueno, Vector puede ser una opción.

Conclusiones.

Estos cuatro conceptos: LinearSeq, IndexSeq, tail y head son muy mencionados. En la mayoría de artículos o preguntas de Stack Overflow que leas se dará por hecho que los conoces. No está de más conocerlos, te serán útiles más adelante.

Gustavo Sánchez