Respostas:
Em termos de Java, Scala Seq
seria Java List
e Scala List
seria Java LinkedList
.
Observe que Seq
é a trait
, que é equivalente ao Java interface
, mas com o equivalente aos métodos defensores promissores. Scala's List
é uma classe abstrata que é estendida por Nil
e ::
, quais são as implementações concretas de List
.
Então, onde Java List
é um interface
, Scala List
é uma implementação.
Além disso, o Scala's List
é imutável, o que não é o caso LinkedList
. De fato, Java não tem equivalente a coleções imutáveis (a coisa somente leitura garante que o novo objeto não possa ser alterado, mas você ainda pode alterar a antiga e, portanto, a "somente leitura").
O Scala's List
é altamente otimizado por compilador e bibliotecas, e é um tipo de dados fundamental em programação funcional. No entanto, possui limitações e é inadequado para programação paralela. Hoje em dia, Vector
é uma escolha melhor do que List
, mas o hábito é difícil de quebrar.
Seq
é uma boa generalização para sequências; portanto, se você programa para interfaces, deve usá-lo. Note-se que na verdade existem três deles: collection.Seq
, collection.mutable.Seq
e collection.immutable.Seq
, e é este último que é o "default" importados para escopo.
Há também GenSeq
e ParSeq
. Os últimos métodos são executados em paralelo, sempre que possível, enquanto o primeiro é pai de ambos Seq
e ParSeq
, sendo uma generalização adequada para quando o paralelismo de um código não importa. Ambos são introduzidos relativamente recentemente, para que as pessoas ainda não os usem muito.
UnsupportedOperationException
por causa disso. Para criar uma lista imutável em Java, use o Collections.unmodifiableList () e, da mesma forma, existem outros métodos para Sets, Mapas etc. docs.oracle.com/javase/6/docs/api/java/util/…
Uma Seq é um Iterable que possui uma ordem definida de elementos. As seqüências fornecem um método apply()
para indexação, variando de 0 até o comprimento da sequência. Seq possui muitas subclasses, incluindo Fila, Intervalo, Lista, Pilha e LinkedList.
Uma lista é uma Seq implementada como uma lista vinculada imutável. É melhor usado em casos com padrões de acesso LIFO (último a entrar, primeiro a sair).
Aqui está a hierarquia completa da classe de coleção nas Perguntas frequentes do Scala :
Seq
é uma característica que List
implementa.
Se você definir seu contêiner como Seq
, poderá usar qualquer contêiner que implemente Seq
característica.
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
Observe que
scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)
É apenas uma mão curta para:
scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)
se o tipo de contêiner não for especificado, a estrutura de dados subjacente será padronizada como List
.
No Scala, uma Lista herda da Seq, mas implementa Produto ; Aqui está a definição adequada de Lista :
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[Nota: a definição real é um pouco mais complexa, a fim de se encaixar e usar a estrutura de coleta muito poderosa do Scala.]
Como @ daniel-c-sobral disse, List estende a característica Seq e é uma classe abstrata implementada por scala.collection.immutable.$colon$colon
(ou ::
para abreviar), mas tecnicamente à parte, lembre-se de que a maioria das listas e seqs que usamos são inicializadas na forma de Seq(1, 2, 3)
ou List(1, 2, 3)
que retornam scala.collection.immutable.$colon$colon
, portanto, pode-se escrever:
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, eu argumentaria que a única coisa que importa são os métodos que você deseja expor, por exemplo, para adicionar um prefixo que você pode usar ::
da Lista que eu acho redundante no +:
Seq e pessoalmente adiro ao Seq por padrão.
String
não seja uma coleção, é um exemplo de classes imutáveis familiares aos programadores Java.