Respuestas:
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.
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 :
Seq
es un rasgo que List
implementa.
Si define su contenedor como Seq
, puede usar cualquier contenedor que implemente Seq
rasgo.
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 es la predeterminada List
.
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 real es un poco más compleja, para encajar y utilizar el muy poderoso marco de colección de Scala.]
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 de Seq(1, 2, 3)
o List(1, 2, 3)
ambas devuelven scala.collection.immutable.$colon$colon
, por lo tanto, uno puede escribir:
var x: scala.collection.immutable.$colon$colon[Int] = null
x = Seq(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
x = List(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
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.
String
no es una colección, es un ejemplo de clases inmutables familiares para los programadores de Java.