Dường như cả Iterator và Stream đều lười và cho phép bạn tiếp tục trả lại các yếu tố cho nội dung trái tim của bạn. Sự khác nhau giữa hai cái là gì?Sự khác biệt giữa Iterator và Stream trong Scala?
Trả lời
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.
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).
- Vì vậy, bạn nên luôn xác định suối sử dụng
def
và không bao giờ đặt nó vào biến địa phương trong đó có một phạm vi tồn tại lâu dài. - Ngoài ra còn có sự tinh tế khi viết hàm đệ quy sử dụng Streams,
- Có thể có một số hành vi bất ngờ phát sinh từ thực tế là Scala của
Stream
không phải là lười biếng trong đầu của nó, giống như
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.
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
- 1. Sự khác biệt giữa Java Enumeration và Iterator
- 2. Sự khác nhau giữa Iterator và Listiterator?
- 3. Sự khác biệt giữa Stream.CopyTo và MemoryStream.WriteTo
- 4. Sự khác biệt giữa. và #
- 5. Sự khác biệt giữa $ (...) và `...`
- 6. Sự khác biệt giữa = và: =
- 7. Sự khác biệt giữa $ * và $ @
- 8. Sự khác biệt giữa ". +" Và ". +?"
- 9. Sự khác biệt giữa "**/* /" và "** /"?
- 10. Sự khác biệt giữa '.' và "." trong java
- 11. Sự khác biệt giữa. và: trong Lua
- 12. sự khác biệt giữa 'và "trong JavaScript?
- 13. Sự khác biệt giữa! và !! trong yaml?
- 14. Sự khác biệt giữa $ @ và $! trong perl
- 15. Sự khác biệt giữa SwingWorker và SwingUtilities.invokeLater
- 16. Sự khác biệt giữa fgets và fscanf?
- 17. Sự khác biệt giữa self.navigationController.navigationItem và self.navigationItem
- 18. sự khác biệt giữa $ .getJSON và $ .get
- 19. Sự khác biệt giữa WebApiConfig.cs và RouteConfig.cs
- 20. Sự khác biệt giữa __construct() và init()
- 21. Sự khác biệt giữa RASPHONE.exe và RASDIAL.exe
- 22. Sự khác biệt giữa viewbag và viewstate?
- 23. sự khác biệt giữa query.list và query.iterate
- 24. Sự khác biệt giữa Window.load và document.readyState
- 25. Sự khác biệt giữa URL và URI?
- 26. Sự khác biệt giữa Z3 và coq
- 27. Sự khác biệt giữa textMultiLine và textLongMessage
- 28. Sự khác biệt giữa modelAttribute và commandName
- 29. Sự khác biệt giữa idl và odl
- 30. Sự khác biệt giữa MKCoordinateSpan và CLLocationCoordinate2D
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
@ryeguy Đó là O (n) vì Stream tạo danh sách liên kết để lưu các giá trị phần tử. –
OK, vậy sự khác nhau giữa Phát trực tiếp và Iterable là gì? –