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?
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.
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:
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.]
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
.
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