Xuất thân từ một nền Java
, tôi quen với thực tế phổ biến đối phó với các bộ sưu tập: rõ ràng là sẽ có ngoại lệ nhưng mã này thường sẽ trông như thế:Scala bộ sưu tập tiêu chuẩn thực hành
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);
}
}
tôi phải thú nhận rằng Tôi hơi bối rối bởi rất nhiều lựa chọn ở Scala. Có:
scala.List
(vàSeq
)scala.collections.Set
(vàMap
)scala.collection.immutable.Set
(vàMap
,Stack
nhưng khôngList
)scala.collection.mutable.Set
(vàMap
,Buffer
nhưng khôngList
)scala.collection.jcl
Vì vậy, câu hỏi!
- Tại sao
List
vàSeq
định nghĩa trong góiscala
và khôngscala.collection
(mặc dù triển khai củaSeq
là trong bộ sưu tập phụ gói)? - Cơ chế tiêu chuẩn để khởi tạo một bộ sưu tập là gì và sau đó đóng băng nó (trong Java đạt được bằng cách gói trong một
unmodifiable
)? - Tại sao một số loại bộ sưu tập (ví dụ:
MultiMap
) chỉ được định nghĩa là có thể thay đổi? (Không có bất biếnMultiMap
)?
Tôi đã đọc số excellent series on scala collections của Daniel Spiewak và tôi vẫn bối rối về cách người ta thực sự sử dụng chúng trong thực tế. Sau đây dường như hơi khó sử dụng do tờ khai trọn gói được thực thi:
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 : _ *)
}
}
Mặc dù cho là đây là chính xác hơn so với phiên bản Java như bộ sưu tập bất biến không thể thay đổi (như trong trường hợp Java, nơi mà các bộ sưu tập cơ bản có thể được thay đổi bên dưới vỏ bọc unmodifiable
)
Tôi đoán khả năng vòng lặp của nó thông qua thứ gì đó và thêm nó vào tập hợp, thay vì chỉ là một nhóm giá trị. – runT1ME