Я трохи розгорну свій коментар. Структура List[T]
даних, від scala.collection.immutable
оптимізована для роботи так, як працює незмінний список на більш чисто функціональній мові програмування. Це дуже швидкий набір часу, і передбачається, що ви будете працювати над головою майже весь свій доступ.
У незмінних списках є дуже швидкі передумови через те, що вони моделюють свої зв'язані списки у вигляді серії "мінусових комірок". Клітина визначає єдине значення та вказівник на наступну клітинку (класичний стиль одиночно пов'язаного списку):
Cell [Value| -> Nil]
Коли ви додаєте до списку, ви дійсно просто створюєте одну нову клітинку, а решта існуючого списку вказується на:
Cell [NewValue| -> [Cell[Value| -> Nil]]
Оскільки список незмінний, ви можете це зробити без фактичного копіювання . Немає небезпеки зміни старого списку і приведення всіх значень вашого нового списку до недійсних. Однак ви втрачаєте можливість мати змінний вказівник на кінець свого списку як компроміс.
Це дуже добре рекурсивно працює над списками. Скажімо, ви визначили свою власну версію filter
:
def deleteIf[T](list : List[T])(f : T => Boolean): List[T] = list match {
case Nil => Nil
case (x::xs) => f(x) match {
case true => deleteIf(xs)(f)
case false => x :: deleteIf(xs)(f)
}
}
Це рекурсивна функція, яка працює виключно з заголовка списку і використовує переваги відповідності шаблонів через :: екстрактор. Це те, що ви багато бачите в таких мовах, як Haskell.
Якщо ви дійсно бажаєте швидкого додавання, Scala надає безліч змінних та незмінних структур даних на вибір. З боку, що змінюється, ви можете заглянути ListBuffer
. Крім того, Vector
від scala.collection.immutable
має швидкий час додавання.