Hay varias formas de construir una lista inmutable en Scala (vea el código de ejemplo artificial a continuación). Puede usar un ListBuffer mutable, crear una var
lista y modificarla, usar un método recursivo de cola y probablemente otros que no conozco.
Instintivamente, uso ListBuffer, pero no tengo una buena razón para hacerlo. ¿Existe un método preferido o idiomático para crear una lista, o hay situaciones que son mejores para un método sobre otro?
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
¿Es porque se crea una nueva lista ? Considerando que, el uso de una operación de prefijo no creará una nueva lista?Nil
. En segundo lugar, no hay copia de ningún tipo al anteponer: se crea un elemento apuntando a la lista existente, y eso es todo.Y para casos sencillos:
:)
fuente
Uhmm ... me parecen demasiado complejos. Puedo proponer
o
fuente
Desea centrarse en la inmutabilidad en Scala generalmente eliminando cualquier var. La legibilidad sigue siendo importante para su prójimo, así que:
Tratar:
Probablemente ni siquiera necesite convertir a una lista en la mayoría de los casos :)
La secuencia indexada tendrá todo lo que necesita:
Es decir, ahora puede trabajar en ese IndexedSeq:
fuente
Vector
ahora también es laSeq
implementación predeterminada .Siempre prefiero List y uso "plegar / reducir" antes que "para comprensión". Sin embargo, se prefiere "para la comprensión" si se requieren "pliegues" anidados. La recursividad es el último recurso si no puedo realizar la tarea usando "plegar / reducir / para".
así que para tu ejemplo, haré:
antes que yo:
Nota: utilizo "foldRight (: \)" en lugar de "foldLeft (/ :)" aquí debido al orden de "_" s. Para una versión que no arroja StackOverflowException, use "foldLeft" en su lugar.
fuente
((0 to 3) :\ List[Int]())(_ :: _)
emoticode?Usando
List.tabulate
, así,fuente
Nota: esta respuesta está escrita para una versión anterior de Scala.
Las clases de la colección de Scala se rediseñarán a partir de Scala 2.8, así que esté preparado para cambiar la forma en que crea listas muy pronto.
¿Cuál es la forma compatible con versiones posteriores de crear una lista? No tengo ni idea ya que todavía no he leído los documentos 2.8.
Un documento PDF que describe los cambios propuestos de las clases de colección.
fuente
Como nuevo desarrollador de Scala, escribí una pequeña prueba para verificar el tiempo de creación de la lista con los métodos sugeridos anteriormente. Parece (para (p <- (0 ax)) rendimiento p) para enumerar el enfoque más rápido.
fuente
solo un ejemplo que usa collection.breakOut
fuente
Para crear una lista de cadenas, use lo siguiente:
fuente