Diferencia entre un Seq y una Lista en Scala


He visto en muchos ejemplos que a veces se utiliza un Seq, mientras que otras veces es la Lista...

¿Hay alguna diferencia, aparte de que el primero es un tipo Scala y la Lista viene de Java?

Author: Jonik, 2012-06-03

4 answers

En términos de Java, el Seq de Scala sería el List de Java, y el List de Scala sería el LinkedList de Java.

Tenga en cuenta que Seq es un trait, que es equivalente a interface de Java, pero con el equivalente de los métodos defender prometedores. Scala List es una clase abstracta que se extiende por Nil y ::, que son las implementaciones concretas de List.

Así, donde Java List es un interface, Scala List es una implementación.

Más allá de eso, el List de Scala es inmutable, lo cual no es el caso de LinkedList. De hecho, Java no tiene equivalente a colecciones inmutables (lo de solo lectura solo garantiza que el nuevo objeto no se puede cambiar, pero aún puede cambiar el antiguo y, por lo tanto, el de solo lectura).

El List de Scala está altamente optimizado por el compilador y las bibliotecas, y es un tipo de datos fundamental en la programación funcional. Sin embargo, tiene limitaciones y es inadecuado para la programación paralela. En estos días, Vector es una mejor opción que List, pero el hábito es difícil de romper.

Seq es una buena generalización para secuencias, así que si programas a interfaces, deberías usar eso. Tenga en cuenta que en realidad hay tres de ellos: collection.Seq, collection.mutable.Seq y collection.immutable.Seq, y es el último que es el "predeterminado" importado en el ámbito.

También Hay GenSeq y ParSeq. Los últimos métodos se ejecutan en paralelo cuando es posible, mientras que el primero es padre de Seq y ParSeq, siendo una generalización adecuada para cuando el paralelismo de un código no asunto. Ambos son relativamente nuevos, por lo que la gente no los usa mucho todavía.

 302
Author: Daniel C. Sobral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-06 14:39:38

A Seq es un iterable que tiene un orden definido de elementos. Las secuencias proporcionan un método apply() para la indexación, que va desde 0 hasta la longitud de la secuencia. Seq tiene muchas subclases incluyendo Cola, Rango, Lista, Pila y Lista de enlaces.

Una List es una Seq que se implementa como una lista enlazada inmutable. Se usa mejor en casos con patrones de acceso de última entrada, primera salida (LIFO).

Aquí está la jerarquía de clases de la colección completa de la Scala Preguntas frecuentes:

introduzca la descripción de la imagen aquí

 32
Author: Ceasar Bautista,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 23:31:09

En Scala, una Lista hereda de Seq, pero implementa Producto ; aquí está la definición adecuada de Lista :

sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...

[Nota: la definición actual es un poco más compleja, con el fin de encajar y hacer uso del poderoso framework de colección de Scala.]

 16
Author: zakelfassi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-04 13:44:47

Seq es un rasgo que List implementa.

Si define su contenedor como Seq, puede usar cualquier contenedor que implemente el rasgo Seq.

scala> def sumUp(s: Seq[Int]): Int = { s.sum }
sumUp: (s: Seq[Int])Int

scala> sumUp(List(1,2,3))
res41: Int = 6

scala> sumUp(Vector(1,2,3))
res42: Int = 6

scala> sumUp(Seq(1,2,3))
res44: Int = 6

Tenga en cuenta que

scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)

Es solo una mano corta para:

scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)

Si no se especifica el tipo de contenedor, la estructura de datos subyacente por defecto es List.

 7
Author: Akavall,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-26 20:11:03