2009-10-06 28 views

Trả lời

42

Luồng memoises và Iterator thì không. Bạn có thể duyệt cùng một Luồng nhiều lần và nhận được cùng một kết quả mỗi lần. Iterator, mặt khác, chỉ có thể được đi qua một lần.

+1

Liên quan đến việc ghi nhớ - nếu tôi truy cập phần tử thứ N, là thời gian truy cập O (1) hoặc O (N)? – ryeguy

+7

@ryeguy Đó là O (n) vì Stream tạo danh sách liên kết để lưu các giá trị phần tử. –

+1

OK, vậy sự khác nhau giữa Phát trực tiếp và Iterable là gì? –

18

Cả hai đều là cấu trúc để truy cập phần tử hiện tại, có danh sách yếu tố còn lại chưa biết (đuôi lười).

Iterator là cấu trúc bắt buộc mà bạn chỉ có thể đi qua một lần.

Stream là cấu trúc chức năng. Về lý thuyết bạn có thể đi qua nó nhiều lần (và như những người khác đã đề cập, nó sẽ không tính toán lại các phần đã được tính toán), nhưng trong thực tế vì các luồng là vô hạn hoặc rất lớn (đó là lý do bạn sử dụng nó ngay từ đầu) tham chiếu đến toàn bộ luồng không có ý nghĩa nhiều (bạn chạy vào bộ nhớ ngoài khá dễ dàng).

Nói chung nó là an toàn hơn để tâm đến tránh đồng bằng Stream s. Các giải pháp thay thế đang sử dụng EphemeralStream của Scalaz để tự động quên các phần không được yêu cầu bằng cách sử dụng các tham chiếu yếu hoặc sử dụng Iteratees (xem thêm here) hoặc something similiar.

+0

Tôi rất tò mò: tại sao EphemeralStream không phải là triển khai mặc định? Bạn luôn có thể tái tạo lại một phần bị lãng quên từ dòng dữ liệu (một ngôn ngữ chức năng của nó). Điều này nghe giống như một lỗ hổng thiết kế lớn. – tribbloid

Các vấn đề liên quan