在一次寫一個返回數據庫中未批改的做業的功能時,偶然接觸到了迭代器的概念。從倉庫層獲取全部做業,我想經過遍歷查找每一個做業Reviewed字段是否爲false,若是爲false,則遍歷中止,返回該做業。可是如何從全部做業中一個一個獲取做業呢。html
咱們獲取一個表中的全部字段是調用的倉庫層的findAll()
方法,數據庫
Iterable<T> findAll();
我發現他放回的是Iterable<T>類型,我就去查了Iterable的意思,譯爲可迭代的。而後就去網上找Iterable容器使用方法。
下面說明一下它的使用
1.使用方法iterator()
要求容器返回一個Iterator
。咱們如今接收到的是可迭代的容器,使用iterator()方法變成迭代器。設計模式
Iterable<Work> works = workRepository.findAll(); Iterator iter = works.iterator()
如今咱們就得到了一個迭代器。
2.使用next()得到序列中的下一個元素。第一次調用Iterator的next()方法時,它返回序列的第一個元素。數組
Work nextWork = (Work)iter.next();
3.使用hasNext()檢查序列中是否還有元素。這樣咱們就能夠在for循環中加以判斷。.net
Iterable<Work> works = workRepository.findAll(); for (Iterator iter = works.iterator(); iter.hasNext();) { Work nextWork = (Work)iter.next(); if (nextWork.getReviewed() == false) { return nextWork; } } return null; }
最後代碼,構造一個for循環,不斷地判斷下一個做業是否批閱過。用hasNext方法判斷迭代器是否到頭了。
4.使用remove()將迭代器新返回的元素刪除。這裏咱們沒有用到,這個方法而不經常使用。設計
迭代器是一種設計模式,同時他也是一個對象,下面是他的部分源碼,咱們能夠看到他的三個方法。code
public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } }
迭代器就像一輛火車,咱們只能從車頭走向第二列車箱,從第二列車箱走向下一列車箱,而不能從車頭直接調到車尾。
咱們只能訪問他的下一個元素,這跟咱們的數組有所區別。所以,迭代器適合訪問鏈式結構。同時,它還能夠訪問沒有順序的集合。htm
迭代器做爲一種設計模式,咱們無須考慮遍歷序列的底層結構,只要拿到這個對象,使用迭代器就能夠遍歷這個對象的內部。這使得咱們的遍歷與被遍歷對象分離。對象