Đầu tiên, tất cả đều không nghiêm ngặt . Điều đó có một ý nghĩa toán học cụ thể liên quan đến các hàm, nhưng, về cơ bản, có nghĩa là chúng được tính toán theo yêu cầu thay vì trước.
Stream
là một danh sách lười biếng thực sự. Trong thực tế, ở Scala, a Stream
là một List
người có tail
a lazy val
. Sau khi tính toán, một giá trị vẫn được tính toán và được sử dụng lại. Hoặc, như bạn nói, các giá trị được lưu trữ.
An Iterator
chỉ có thể được sử dụng một lần vì nó là con trỏ truyền tải vào bộ sưu tập chứ không phải là bộ sưu tập. Điều gì làm cho nó đặc biệt trong Scala là một thực tế mà bạn có thể áp dụng chuyển đổi như map
và filter
và chỉ cần có được một mới Iterator
sẽ chỉ áp dụng những biến đổi khi bạn yêu cầu các phần tử tiếp theo.
Scala đã từng cung cấp các trình vòng lặp có thể được đặt lại, nhưng điều đó rất khó để hỗ trợ một cách chung chung và họ đã không tạo ra phiên bản 2.8.0.
Lượt xem có nghĩa là được xem giống như chế độ xem cơ sở dữ liệu. Đó là một loạt các phép biến đổi áp dụng cho bộ sưu tập để tạo ra bộ sưu tập "ảo". Như bạn đã nói, tất cả các phép biến đổi được áp dụng lại mỗi lần bạn cần tìm nạp các phần tử từ nó.
Cả hai Iterator
và quan điểm có đặc điểm bộ nhớ tuyệt vời. Stream
là tốt, nhưng, trong Scala, lợi ích chính của nó là viết các chuỗi vô hạn (đặc biệt là các chuỗi được định nghĩa đệ quy). Tuy nhiên, người ta có thể tránh giữ tất cả Stream
bộ nhớ trong bằng cách đảm bảo rằng bạn không giữ một tham chiếu đến nó head
(ví dụ: bằng cách sử dụng def
thay vì val
để xác định Stream
).
Do các hình phạt phát sinh bởi các chế độ xem, người ta thường nên xử lý force
nó sau khi áp dụng các biến đổi hoặc giữ nó làm chế độ xem nếu chỉ có một số yếu tố được mong đợi được tìm nạp, so với tổng kích thước của chế độ xem.