編寫自己的迭代器的流程是:首先實現Iterable接口,進而實現該接口中的Iterator<T> iterator()方法,該方法返回接口Iterator,Iterator接口中封裝了next,hasnext,remove等方法。實現了Iterable接口的類能夠通過foreach進行遍歷,分析Iterable與Iterator的區別:
(1)Iterable是對Iterator的外層封裝,對其加了一層外衣;
(2)接口Iterable依賴於Iterator接口;
(3)直接實現Iterable而不直接實現Iterator的原因:Iterator接口的核心方法next()或者hasNext() 是依賴於迭代器的當前迭代位置的。如果Collection直接實現Iterator接口,勢必導致集合對象中包含當前迭代位置的數據(指針)。當集合在不同方法間被傳遞時,由於當前迭代位置不可預置,那麼next()方法的結果會變成不可預知。除非再為Iterator接口添加一個reset()方法,用來重置當前迭代位置。但即時這樣,Collection也只能同時存在一個當前迭代位置。而Iterable則不然,每次調用都會返回一個從頭開始計數的迭代器。多個迭代器是互不干擾的。
具體例子:
import java.util.Iterator;
/**
* 實現Iterable<E>接口的Person類
* @author yangqinjiang
*
*/
public class Person implements Iterable<Person>{
/**
* 實現Iterable接口中要求實現的方法
*/
@Override
public Iterator<Person> iterator() {
return new MyIterator();//返回一個MyIterator實例對象
}
/**
* MyIterator是內部類,實現了Iterator<E>接口的類
* 像這樣的內部類,在網絡上有很多這樣的寫法,我這裡只是參考他們的寫法罷了
* @author yangqinjiang
*
*/
class MyIterator implements Iterator<Person>{
/**相當於索引*/
private int index =0;
@Override
public boolean hasNext() {
//只要在調用next()後,index自加,確保index不等於person的長度
return index!=person.length;
}
@Override
public Person next() {
//使用索引來獲取person數組中的某一項
return person[index++];
}
@Override
public void remove() {
//未實現這個方法
}
}
private String name;
private int age;
/**person數組,是目標操作對象*/
private Person[] person;
/**為了方便簡單點,故寫一個這樣的構造方法*/
public Person(int size){
person=new Person[size];
for (int i = 0; i < size; i++) {
person[i]=new Person(""+i, i);
}
}
public void add(Person person){
//未實現這個方法
}
public Person(){
//未實現這個方法
}
public Person(String name,int age){
this.name=name;
this.age=age;
}
//getter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "person [name=" + name + ", age=" + age + "]";
}
}