java iterator(迭代器)
阿新 • • 發佈:2019-01-11
任何容器類,都必須有某種方式可以插入元素並將它們再次取出,畢竟持有事物是容器最基本的工作,對於List,add()插入fang,get()取出,如果從更高層的角度思考,會發現這裡有個確定:要用容器,必須對容器的確切型別程式設計,這樣如果原本是List編碼的,但是後來要應用於Set,那麼此時該怎麼辦,是重寫通用程式碼還是如何
迭代器(也是一種設計模式)的概念可用於達成這個目的,迭代器是一個物件,它的工作是遍歷並選擇序列中 物件,而客服端程式設計師不必關心或知道該序列的底層結構,此外迭代器通常被稱為輕量級物件:建立它的代價很小. 因此經常可以見到對迭代器有些奇怪的限制;例如,Java的Iterator只能單向移動,這個Iterator只能用來:
1)使用方法iterator()要求容器返回一個Iterator. Iterator將準備好返回序列的第一個元素
2)使用next()獲得序列中的下一個元素
3)使用hasNext()檢查序列中是否還有元素
4)使用remove()將迭代器新近返回的元素刪除 (必須先呼叫next())
//: holding/SimpleIteration.java package object; import typeinfo.pets.*; import java.util.*; public class SimpleIteration { public static void main(String[] args) { List<Pet> pets = Pets.arrayList(12); Iterator<Pet> it = pets.iterator(); while(it.hasNext()) { Pet p = it.next(); System.out.print(p.id() + ":" + p + " "); } System.out.println(); // A simpler approach, when possible: for(Pet p : pets) System.out.print(p.id()+ ":" + p + " "); System.out.println(); // An Iterator can also remove elements: it = pets.iterator(); for(int i = 0; i < 6; i++) { it.next(); it.remove(); } System.out.println(pets); } } /* Output: 0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 8:Cymric 9:Rat 10:EgyptianMau 11:Hamster 0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 8:Cymric 9:Rat 10:EgyptianMau 11:Hamster [Pug, Manx, Cymric, Rat, EgyptianMau, Hamster] *///:~
接受物件容器並傳遞它,從而在每個物件上都執行操作,這種思想十分強大,現在建立一個display()方法,它不必知道容器的確切型別,清注意diplay()不包含任何有關它所遍歷的序列的型別資訊,而這也展示了Iterator的真正威力: 能夠將遍歷序列的操作與序列底層的結構分離,正由於此,我們有時會說,迭代器統一了對容器的訪問方式
//: holding/CrossContainerIteration.java package object; import typeinfo.pets.*; import java.util.*; public class CrossContainerIteration { public static void display(Iterator<Pet> it) { while(it.hasNext()) { Pet p = it.next(); System.out.print(p.id() + ":" + p + " "); } System.out.println(); } public static void main(String[] args) { ArrayList<Pet> pets = Pets.arrayList(8); LinkedList<Pet> petsLL = new LinkedList<Pet>(pets); HashSet<Pet> petsHS = new HashSet<Pet>(pets); TreeSet<Pet> petsTS = new TreeSet<Pet>(pets); display(pets.iterator()); display(petsLL.iterator()); display(petsHS.iterator()); display(petsTS.iterator()); } } /* Output: 0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 0:Rat 1:Manx 2:Cymric 3:Mutt 4:Pug 5:Cymric 6:Pug 7:Manx 4:Pug 6:Pug 3:Mutt 1:Manx 5:Cymric 7:Manx 2:Cymric 0:Rat 5:Cymric 2:Cymric 7:Manx 1:Manx 3:Mutt 6:Pug 4:Pug 0:Rat *///:~