Câu trả lời:
Theo thuật ngữ Java, Scala Seq
sẽ là Java List
và Scala List
sẽ là Java LinkedList
.
Lưu ý rằng đó Seq
là một trait
, tương đương với Java interface
, nhưng tương đương với các phương thức bảo vệ sắp tới. Scala's List
là một lớp trừu tượng được mở rộng bởi Nil
và ::
, đó là những triển khai cụ thể của List
.
Vì vậy, trong đó Java List
là một interface
, Scala List
là một triển khai.
Ngoài ra, Scala List
là bất biến, đó không phải là trường hợp LinkedList
. Trong thực tế, Java không có tương đương với các bộ sưu tập bất biến (điều chỉ đọc chỉ đảm bảo đối tượng mới không thể thay đổi, nhưng bạn vẫn có thể thay đổi đối tượng cũ và do đó, chỉ "chỉ đọc").
Scala List
được tối ưu hóa cao bởi trình biên dịch và thư viện và đây là loại dữ liệu cơ bản trong lập trình chức năng. Tuy nhiên, nó có những hạn chế và nó không đủ để lập trình song song. Những ngày này, Vector
là một lựa chọn tốt hơn List
, nhưng thói quen là khó phá vỡ.
Seq
là một khái quát tốt cho các chuỗi, vì vậy nếu bạn lập trình cho các giao diện, bạn nên sử dụng nó. Lưu ý rằng có thực sự ba trong số đó là: collection.Seq
, collection.mutable.Seq
và collection.immutable.Seq
, và nó là một trong những thứ hai đó là "mặc định" nhập khẩu vào phạm vi.
Cũng có GenSeq
và ParSeq
. Các phương thức sau chạy song song khi có thể, trong khi phương thức trước là cha mẹ của cả hai Seq
và ParSeq
, là một khái quát hóa phù hợp khi sự song song của mã không thành vấn đề. Cả hai đều tương đối mới được giới thiệu, vì vậy mọi người chưa sử dụng chúng nhiều.
UnsupportedOperationException
vì điều này. Để tạo một danh sách bất biến trong Java bạn sử dụng Collections.unmodifiableList () và tương tự có phương pháp khác để Sets, Maps, vv docs.oracle.com/javase/6/docs/api/java/util/...
Một Seq là một Iterable mà có một trật tự xác định các yếu tố. Trình tự cung cấp một phương pháp apply()
để lập chỉ mục, từ 0 đến chiều dài của trình tự. Seq có nhiều lớp con bao gồm Queue, Range, List, Stack và LinkedList.
Một Danh sách là một Seq đó được thực hiện như một danh sách liên kết không thay đổi. Nó được sử dụng tốt nhất trong các trường hợp có mẫu truy cập vào trước xuất trước (LIFO).
Dưới đây là hệ thống phân cấp lớp bộ sưu tập hoàn chỉnh từ Câu hỏi thường gặp về Scala :
Seq
là một đặc điểm List
thực hiện.
Nếu bạn xác định vùng chứa của mình là Seq
, bạn có thể sử dụng bất kỳ vùng chứa nào thực hiện Seq
tính trạng.
scala> def sumUp(s: Seq[Int]): Int = { s.sum }
sumUp: (s: Seq[Int])Int
scala> sumUp(List(1,2,3))
res41: Int = 6
scala> sumUp(Vector(1,2,3))
res42: Int = 6
scala> sumUp(Seq(1,2,3))
res44: Int = 6
Lưu ý rằng
scala> val a = Seq(1,2,3)
a: Seq[Int] = List(1, 2, 3)
Chỉ là một bàn tay ngắn cho:
scala> val a: Seq[Int] = List(1,2,3)
a: Seq[Int] = List(1, 2, 3)
nếu loại vùng chứa không được chỉ định, cấu trúc dữ liệu cơ bản mặc định là List
.
Trong Scala, Danh sách kế thừa từ Seq, nhưng thực hiện Sản phẩm ; đây là định nghĩa đúng của Danh sách :
sealed abstract class List[+A] extends AbstractSeq[A] with Product with ...
[Lưu ý: các thực tế định nghĩa . Là một chút cắn phức tạp hơn, để phù hợp với và sử dụng khuôn khổ bộ sưu tập rất mạnh mẽ của Scala]
Như @ daniel-c-sobral đã nói, List mở rộng đặc điểm Seq và là một lớp trừu tượng được thực hiện bởi scala.collection.immutable.$colon$colon
(hoặc ::
viết tắt), nhưng về mặt kỹ thuật, hãy nhớ rằng hầu hết các danh sách và seq chúng tôi sử dụng đều được khởi tạo ở dạng Seq(1, 2, 3)
hoặc List(1, 2, 3)
cả hai đều trả về scala.collection.immutable.$colon$colon
, do đó người ta có thể viết:
var x: scala.collection.immutable.$colon$colon[Int] = null
x = Seq(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
x = List(1, 2, 3).asInstanceOf[scala.collection.immutable.$colon$colon[Int]]
Kết quả là, tôi tranh luận hơn điều duy nhất quan trọng là các phương thức bạn muốn đưa ra, ví dụ, để trả trước bạn có thể sử dụng ::
từ Danh sách mà tôi thấy dư thừa +:
từ Seq và cá nhân tôi mặc định dính vào Seq.
String
không phải là một bộ sưu tập, nó là một ví dụ về các lớp bất biến quen thuộc với các lập trình viên Java.