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