Я могу придумать 3 более конкретных вопроса, чтобы ответить на ваш:
- Что такое коллекция Scala по умолчанию?
- Какая коллекция Scala имеет характеристики, аналогичные
ArrayList
?
- Какая хорошая замена для
Array
в Scala?
Итак, вот ответы на эти вопросы:
Что такое коллекция Scala по умолчанию?
Эквивалентом Scala интерфейса Java List
является Seq
. Существует также более общий интерфейс - GenSeq
- главное отличие в том, что GenSeq
может иметь операции, обрабатываемые последовательно или параллельно, в зависимости от реализации.
Поскольку Scala позволяет программистам использовать Seq
в качестве фабрики, они не часто задаются определением конкретной реализации, если не заботятся об этом. Когда они это сделают, они обычно выберут либо List
, либо Vector
Скалы. Они оба неизменны, и Vector
имеет хорошую производительность индексированного доступа. С другой стороны, List
очень хорошо выполняет операции, которые он делает хорошо.
Какая коллекция Scala имеет характеристики, аналогичные ArrayList
?
Это было бы scala.collection.mutable.ArrayBuffer
.
Какая хорошая замена для Array
в Scala?
Что ж, хорошая новость в том, что вы можете просто использовать Array
в Scala! В Java часто избегают Array
из-за его общей несовместимости с обобщениями. Это ко-вариантная коллекция, в то время как дженерики инвариантны, они изменчивы - что делает их ковариацию опасной, она принимает примитивы там, где дженерики нет, и имеет довольно ограниченный набор методов.
В Scala Array
- то же самое Array
, что и в Java - является инвариантом, что устраняет большинство проблем. Scala принимает AnyVal
(эквивалент примитивов) в качестве типов для своих «дженериков», даже если он будет выполнять автобокс. И благодаря шаблону «обогатить мою библиотеку» методы ALL из Seq
доступны для Array
.
Итак, если вы хотите более мощный Array
, просто используйте Array
.
А как насчет коллекции, которая уменьшается и растет?
Методы по умолчанию, доступные для всех коллекций, создают новые коллекции. Например, если я сделаю это:
val ys = xs filter (x => x % 2 == 0)
Тогда ys
будет новой коллекцией, тогда как xs
будет таким же, как и до этой команды. Это верно, независимо от того, что xs
было: Array
, List
и т. Д.
Естественно, это имеет свою стоимость - в конце концов, вы производите новую коллекцию. Неизменяемые коллекции Scala намного лучше справляются с этой стоимостью, поскольку они постоянны , но это зависит от того, какая операция выполняется.
Ни одна коллекция не может многое сделать с filter
, но List
имеет отличную производительность при генерации новой коллекции путем добавления элемента или удаления заголовка - по сути, основных операций стека. Vector
имеет хорошую производительность при выполнении множества операций, но платит только в том случае, если коллекция не маленькая. Для коллекций, скажем, до ста элементов, общая стоимость может превысить выигрыш.
Таким образом, вы можете добавлять или удалять элементы в Array
, и Scala создаст для вас new Array
, но при этом вы заплатите полную стоимость копии. .
Изменяемые коллекции Scala добавляют несколько других методов. В частности, коллекции, которые могут увеличивать или уменьшать размер - без создания новой коллекции - реализуют черты Growable
и Shrinkable
. Они не гарантируют хорошую производительность при этих операциях, но они укажут вам на коллекции, которые вы хотите проверить.