来自Java
背景,我习惯于处理集合的常见做法:显然会有例外,但通常代码如下所示:
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
)?
我已经阅读了 Daniel Spiewak关于 scala 集合的优秀系列,但我仍然对如何在实践中实际使用它们感到困惑。由于强制执行完整的包声明,以下内容似乎有点笨拙:
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
包装器下更改底层集合)