Existem várias maneiras de construir uma lista imutável no Scala (consulte o código de exemplo inventado abaixo). Você pode usar um ListBuffer mutável, criar uma var
lista e modificá-la, usar um método recursivo de cauda e provavelmente outros que eu não conheço.
Instintivamente, eu uso o ListBuffer, mas não tenho um bom motivo para fazer isso. Existe um método preferencial ou idiomático para criar uma lista ou há situações que são melhores para um método em vez de outro?
import scala.collection.mutable.ListBuffer
// THESE are all the same as: 0 to 3 toList.
def listTestA() ={
var list:List[Int] = Nil
for(i <- 0 to 3)
list = list ::: List(i)
list
}
def listTestB() ={
val list = new ListBuffer[Int]()
for (i <- 0 to 3)
list += i
list.toList
}
def listTestC() ={
def _add(l:List[Int], i:Int):List[Int] = i match {
case 3 => l ::: List(3)
case _ => _add(l ::: List(i), i +1)
}
_add(Nil, 0)
}
What you DON'T do is use a List and append to it
É porque uma nova lista foi criada? Visto que usar uma operação prefixar não criará uma nova lista?Nil
. Em segundo lugar, não há cópia de nenhum tipo no prefixo: um elemento é criado apontando para a lista existente e é isso.E para casos simples:
:)
fonte
Uhmm .. isso parece muito complexo para mim. Posso propor
ou
fonte
Você deseja focar na imutabilidade no Scala geralmente eliminando qualquer vars. A legibilidade ainda é importante para o seu próximo, então:
Experimentar:
Você provavelmente nem precisa converter para uma lista na maioria dos casos :)
A seq indexada terá tudo que você precisa:
Ou seja, agora você pode trabalhar nesse IndexedSeq:
fonte
Vector
agora é também aSeq
implementação padrão .Eu sempre prefiro List e uso "dobrar / reduzir" antes de "para compreensão". No entanto, "para compreensão" é preferível se "dobras" aninhadas forem necessárias. A recursão é o último recurso se eu não conseguir realizar a tarefa usando "dobrar / reduzir / para".
então, para o seu exemplo, farei:
antes de eu fazer:
Nota: Eu uso "foldRight (: \)" em vez de "foldLeft (/ :)" aqui por causa da ordem de "_" s. Para uma versão que não lança StackOverflowException, use "foldLeft".
fonte
((0 to 3) :\ List[Int]())(_ :: _)
emoticode?Usando
List.tabulate
, assim,fonte
Nota: esta resposta foi escrita para uma versão antiga do Scala.
As classes de coleção do Scala serão reprojetadas a partir do Scala 2.8, portanto, esteja preparado para mudar a maneira como você cria listas muito em breve.
Qual é a maneira compatível com versões futuras de criar uma lista? Não tenho ideia, pois ainda não li a documentação do 2.8.
Um documento PDF que descreve as alterações propostas das classes de coleção
fonte
Como um novo desenvolvedor de scala, escrevi um pequeno teste para verificar o tempo de criação da lista com os métodos sugeridos acima. Parece que (for (p <- (0 a x)) produz p) toList a abordagem mais rápida.
fonte
apenas um exemplo que usa collection.breakOut
fonte
Para criar uma lista de strings, use o seguinte:
fonte