Já vi em muitos exemplos que algumas vezes uma Seq está sendo usada, enquanto outras é a Lista ...
Existe alguma diferença, além de o primeiro ser do tipo Scala e a lista vinda do Java?
fonte
Já vi em muitos exemplos que algumas vezes uma Seq está sendo usada, enquanto outras é a Lista ...
Existe alguma diferença, além de o primeiro ser do tipo Scala e a lista vinda do Java?
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.
String
não seja uma coleção, é um exemplo de classes imutáveis familiares aos programadores Java.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 :
fonte
Seq
é uma característica queList
implementa.Se você definir seu contêiner como
Seq
, poderá usar qualquer contêiner que implementeSeq
característica.Observe que
É apenas uma mão curta para:
se o tipo de contêiner não for especificado, a estrutura de dados subjacente será padronizada como
List
.fonte
No Scala, uma Lista herda da Seq, mas implementa Produto ; Aqui está a definição adequada de Lista :
[Nota: a definição real é um pouco mais complexa, a fim de se encaixar e usar a estrutura de coleta muito poderosa do Scala.]
fonte
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 deSeq(1, 2, 3)
ouList(1, 2, 3)
que retornamscala.collection.immutable.$colon$colon
, portanto, pode-se escrever: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.fonte