2010-01-28 15 views
14

1 của bản trình bày cho biết "Các phương pháp này là LAZY!"Hầu hết các phương pháp Iterator và Iterables đều là LAZY! Điều này có nghĩa là gì

Iterable transform(Iterable, Function)* 
Iterable filter(Iterable, Predicate)* 
T find(Iterable<T>, Predicate) 
Iterable concat(Iterable<Iterable>) 
Iterable cycle(Iterable) 
T getOnlyElement(Iterable<T>) 
Iterable<T> reverse(List<T>) 

Ai đó có thể giúp tôi hiểu được ý nghĩa của chúng bằng cách này, cho phép nói rằng tôi đã là một bộ sưu tập các Persons và tôi áp dụng một bộ lọc để trở lại chỉ những người có tên cuối cùng là DOE.

Vậy điều này có nghĩa là "quá trình lọc chỉ xảy ra trong lần gọi đầu tiên tới doeOnly.next()?"

List<Person> persons= .... 
Iterable doeOnly= Iterables.filter(persons,DOE_AS_LAST_NAME_PREDICATE); 
+0

Việc lọc phải xảy ra trong lần gọi đầu tiên tới 'doeOnly.hasNext()' không 'next()', bởi vì nếu chỉ có một phần tử còn lại nhưng nó không thành công thì 'hasNext()' phải trả về false, nhưng bộ lọc không biết rằng cho đến khi nó đã tìm nạp phần tử không khớp. – finnw

Trả lời

28

Điều này có nghĩa là dữ liệu được lọc khi bạn yêu cầu - dữ liệu đó không đi qua danh sách của bạn ngay lập tức và xây dựng danh sách dữ liệu được lọc mới. Thay vào đó, khi bạn gọi iterator.next() (ví dụ: tự động trong vòng lặp nâng cao), trình vòng lặp sẽ hỏi nguồn dữ liệu ngược dòng (bộ sưu tập của bạn) cho mục dữ liệu tiếp theo. Sau đó, nó sẽ cố gắng kết hợp điều này với bộ lọc. Nếu nó khớp với nó, nó sẽ trả về món đồ đó. Nếu không, nó sẽ yêu cầu một mục khác từ bộ sưu tập, tiếp tục cho đến khi nó chạy ra khỏi các mục hoặc tìm thấy một kết quả phù hợp.

Sau đó, khi bạn tiếp theo yêu cầu mục tiếp theo, nó sẽ tiếp tục đi từ nơi nó bị tắt.

Nói cách khác, nó không chỉ có nghĩa là "lọc chỉ xảy ra trên cuộc gọi đầu tiên để doeOnly.next()" - nó có nghĩa là "lọc xảy ra trên mỗi cuộc gọi đến iterator.next()" nơi iterator là kết quả của gọi doeOnly.iterator().

+0

Định nghĩa hữu ích: http://en.wikipedia.org/wiki/Lazy_evaluation. –

+0

thx cho cả hai câu trả lời ... cũng google thu thập sử dụng đánh giá áp dụng hoặc trì hoãn –

+0

tôi hiểu sự lười biếng trong bộ lọc và các phương pháp khác khi chúng trả về Iterable ... nhưng làm thế nào có thể giải thích tìm kiếm tìm kiếm và getOnlyElement –

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