Existen varias formas de crear una lista inmutable en Scala (consulte el código de ejemplo artificial a continuación). Puede usar un ListBuffer mutable, crear una lista var
y modificarla, usar un método tail recursive y probablemente otros que no conozca.Forma preferida para crear una lista de Scala
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 que para 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)
}
'Lo que no hacemos es utilizar una lista y añadir a it' ¿Eso es porque se crea una ** nueva lista **? Considerando que, usando una operación de anteponer no creará una nueva lista? –
@KevinMeredith Sí. Append es O (n), prepend es O (1). –
@pgoggijr Eso no es verdad. Primero, no hay "cambio" en ninguna parte, porque es inmutable. Se requiere un recorrido porque todos los elementos deben copiarse, solo para que se pueda hacer una copia del último elemento apuntando a un nuevo elemento en lugar de 'Nil'. En segundo lugar, no hay copia de ningún tipo en anteponer: se crea un elemento que apunta a la lista existente, y eso es todo. –