Есть несколько способов создать неизменяемый список в Scala (см. Надуманный пример кода ниже). Вы можете использовать изменяемый ListBuffer, создать var
список и изменить его, использовать хвостовой рекурсивный метод и, возможно, другие, о которых я не знаю.
Инстинктивно я использую ListBuffer, но у меня нет для этого веских причин. Есть ли предпочтительный или идиоматический метод создания списка, или есть ситуации, когда один метод лучше другого?
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
Это потому, что создается новый список ? Принимая во внимание, что использование операции добавления не приведет к созданию нового списка?Nil
. Во-вторых, в prepend нет никакой копии: создается элемент, указывающий на существующий список, и все.А для простых случаев:
:)
источник
Умм ... мне это кажется слишком сложным. Могу я предложить
или
источник
Вы хотите сосредоточиться на неизменности в Scala в целом, исключив любые переменные. Читаемость по-прежнему важна для вашего ближнего, поэтому:
Пытаться:
В большинстве случаев вам, вероятно, даже не нужно преобразовывать в список :)
В индексированной последовательности будет все, что вам нужно:
То есть теперь вы можете работать с этим IndexedSeq:
источник
Vector
теперь также являетсяSeq
реализацией по умолчанию .Я всегда предпочитаю List и использую «свернуть / уменьшить» перед «для понимания». Однако «для понимания» предпочтительнее, если требуются вложенные «складки». Рекурсия - это последнее средство, если я не могу выполнить задачу с помощью «свернуть / уменьшить / для».
так что для вашего примера я сделаю:
прежде чем я это сделаю:
Примечание. Я использую «foldRight (: \)» вместо «foldLeft (/ :)» из-за порядка «_». Для версии, которая не генерирует исключение StackOverflowException, используйте вместо этого «foldLeft».
источник
((0 to 3) :\ List[Int]())(_ :: _)
смайлик?Используя
List.tabulate
вот такисточник
Примечание. Этот ответ написан для старой версии Scala.
Классы коллекций Scala будут переработаны, начиная с версии Scala 2.8, поэтому будьте готовы в ближайшее время изменить способ создания списков.
Каков способ создания списка с прямой совместимостью? Я понятия не имею, так как еще не читал документы 2.8.
PDF-документ с описанием предлагаемых изменений классов коллекции.
источник
Как новый разработчик scala, я написал небольшой тест, чтобы проверить время создания списка с помощью предложенных выше методов. Похоже (для (p <- (от 0 до x)) yield p) toList самый быстрый подход.
источник
просто пример, который использует collection.breakOut
источник
Чтобы создать список строк, используйте следующее:
источник