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 el primero es un tipo Scala y la Lista proviene de Java?
fuente
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 el primero es un tipo Scala y la Lista proviene de Java?
En términos de Java, Scala Seq
sería Java List
y Scala List
sería Java LinkedList
.
Tenga en cuenta que Seq
es una trait
, que es equivalente a la de Java interface
, pero con el equivalente de los métodos de defensa emergentes. Scala's List
es una clase abstracta que se extiende por Nil
y ::
, que son implementaciones concretas de List
.
Entonces, donde Java List
es interface
, Scala List
es una implementación.
Más allá de eso, Scala's List
es inmutable, que 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 se puede cambiar el antiguo y, por lo tanto, el de "solo lectura").
Scala's List
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, por lo que si programa en interfaces, debería usarla. Tenga en cuenta que en realidad hay tres de ellos: collection.Seq
, collection.mutable.Seq
y collection.immutable.Seq
, y es este último que es el "default" importado a su alcance.
También hay GenSeq
y ParSeq
. Los últimos métodos se ejecutan en paralelo siempre que sea posible, mientras que el primero es padre de ambos Seq
y ParSeq
, siendo una generalización adecuada para cuando el paralelismo de un código no importa. Ambos son relativamente nuevos, por lo que la gente todavía no los usa mucho.
String
no es una colección, es un ejemplo de clases inmutables familiares para los programadores de Java.UnsupportedOperationException
debido a esto. Para crear una lista inmutable en Java, use Collections.unmodifiableList () y, de manera similar, existen otros métodos para conjuntos, mapas, etc. docs.oracle.com/javase/6/docs/api/java/util/…Un Seq es un Iterable que tiene un orden definido de elementos. Las secuencias proporcionan un método
apply()
para indexar, que van desde 0 hasta la longitud de la secuencia. Seq tiene muchas subclases que incluyen Cola, Rango, Lista, Pila y LinkedList.Una Lista es una Seq que se implementa como una lista vinculada inmutable. Se utiliza 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 :
fuente
Seq
es un rasgo queList
implementa.Si define su contenedor como
Seq
, puede usar cualquier contenedor que implementeSeq
rasgo.Tenga en cuenta que
Es solo una mano corta para:
si no se especifica el tipo de contenedor, la estructura de datos subyacente es la predeterminada
List
.fuente
En Scala, una Lista hereda de Seq, pero implementa Producto ; Aquí está la definición adecuada de Lista :
[Nota: la definición real es un poco más compleja, para encajar y utilizar el muy poderoso marco de colección de Scala.]
fuente
Como dijo @ daniel-c-sobral, List extiende el rasgo Seq y es una clase abstracta implementada por
scala.collection.immutable.$colon$colon
(o::
para abreviar), pero aparte de los tecnicismos, tenga en cuenta que la mayoría de las listas y seqs que usamos se inicializan en forma deSeq(1, 2, 3)
oList(1, 2, 3)
ambas devuelvenscala.collection.immutable.$colon$colon
, por lo tanto, uno puede escribir:Como resultado, diría que lo único que importa son los métodos que desea exponer, por ejemplo, para anteponer que puede usar
::
de la Lista con la que considero redundante+:
de Seq y personalmente me adhiero a Seq de forma predeterminada.fuente