tutorial listas funciones espaƱol ejemplos list scala collections seq

listas - Diferencia entre una secuencia y una lista en Scala



scala ejemplos (4)

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

¿Hay alguna diferencia, aparte de que la anterior sea un tipo Scala y la Lista proveniente de Java?


En Scala, una Lista se hereda de Seq, pero implementa el Product ; Aquí está la definición correcta de la List :

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

[Nota: la definición real es un poco más compleja, para adaptarse y hacer uso del muy poderoso marco de recopilación de Scala.]


Un 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 que incluyen Cola, Rango, Lista, Pila y Lista enlazada.

Una List es una secuencia que se implementa como una lista enlazada inmutable. Se usa mejor en casos con patrones de acceso de último en entrar, primero en salir (LIFO).

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


Seq es un rasgo que implementa la List .

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 se establece de forma predeterminada en List .


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

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

Entonces, donde la List de Java es una interface , la List de Scala es una implementación.

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

La List de Scala está altamente optimizada por compilador y 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, por lo que si programa interfaces, debe usar eso. Tenga en cuenta que en realidad hay tres de ellos: collection.Seq , collection.mutable.Seq y collection.immutable.Seq , y este último es el "predeterminado" importado en el alcance.

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