Исходя из Java
фона, я привык к общей практике работы с коллекциями: очевидно, не будет исключения, но, как правило, код будет выглядеть следующим образом:коллекция Scala стандартная практика
public class MyClass {
private Set<String> mySet;
public void init() {
Set<String> s = new LinkedHashSet<String>();
s.add("Hello");
s.add("World");
mySet = Collections.unmodifiableSet(s);
}
}
Я должен признаться, что Я немного одурманен множеством вариантов в Scala. Существует:
scala.List
(иSeq
)scala.collections.Set
(иMap
)scala.collection.immutable.Set
(иMap
,Stack
но неList
)scala.collection.mutable.Set
(иMap
,Buffer
но неList
)scala.collection.jcl
Так что вопросы!
- Почему
List
иSeq
определены в пакетеscala
и неscala.collection
(даже если реализацииSeq
находятся в коллекции суб-пакетов)? - Что стандартный механизм для инициализации коллекции, а затем замораживание он (который в Java достигается путем оборачивания в
unmodifiable
)? - Почему некоторые типы коллекций (например,
MultiMap
) определяются только как изменяемые? (Нет неизменяемыхMultiMap
)?
Я читал excellent series on scala collections Даниэля Спивака и до сих пор озадачен тем, как на самом деле их можно использовать на практике. Ниже кажется немного громоздкими из-за насильственными полные декларации пакета:
class MyScala {
var mySet: scala.collection.Set[String] = null
def init(): Unit = {
val s = scala.collection.mutable.Set.empty[String]
s + "Hello"
s + "World"
mySet = scala.collection.immutable.Set(s : _ *)
}
}
Хотя, возможно, это правильнее чем версия Java, как неизменная коллекция не может измениться (как в случае Java, где базовая коллекция МОГЛА может быть изменен под unmodifiable
обертке)
Я предполагаю, что он более вероятно, что что-то перебирает что-то и добавляет его в набор, а не только группу значений. – runT1ME