如果你想寫一個foreach方法,訪問List里面的所有對象,你可能會這么寫
public static void forEach(List list) {
int size = list.size();
for(int i = 0; i < size; i++) {
out.println(list.get(i));
}
}
但實(shí)際中歇式,我們不需要這么麻煩偏瓤,因?yàn)樗衏ollection都有一個iterator()方法,在JDK1.4之前這個方法定義在collection接口中的存和,因此所有collection都有這個方法。
iterator()方法會傳回java.util.Iterator介面的實(shí)作物件,這個物件包括了Collection收集的所有物件旦部,你可以使用Iterator的hasNext()看看有無下一個物件,若有的話较店,再使用next()取得下一個物件士八。因此,無論是List梁呈、Set婚度、Queue或任何Collection,都可以使用以下的forEach()來顯示所收集之物件:
iterator方法會傳回java.util.Iterator接口的實(shí)例對象官卡,你可以使用hasNext方法看看有沒有下一個對象蝗茁,如果有的話,在使用next取得下一個對象寻咒,所以無論通過多態(tài)哮翘,無論是List,Set,Queue或者任何collection,都可以使用下面這個foreach方法收集對象:
public static void forEach(Collection collection) {
Iterator iterator = collection.iterator();
while(iterator.hasNext()) {
out.println(iterator.next());
}
}
在JDK5之後,原先定義在Collection中的iterator()方法仔涩,提昇至新的java.util.Iterable父介面忍坷,因此在JDK5之後,你可以使用以下的forEach()方法顯示收集的所有物件:
在JDK5之后熔脂,原先定義在collection中的iterator方法佩研,提升到新的java.util.Iterable接口中,這樣做的好處是霞揉,所有實(shí)現(xiàn)了iterable接口的對象旬薯,都是可迭代的,而之前只有collection是可迭代的适秩。所以在JDK5之后绊序,可以使用下面的foreach方法收集所有的對象:
public static void forEach(Iterable iterable) {
Iterator iterator = iterable.iterator();
while(iterator.hasNext()) {
out.println(iterator.next());
}
}
同時(shí)由于JDk5之后還引入了增強(qiáng)式的for循環(huán),foreach可以進(jìn)一步的簡化
import java.util.*;
public class ForEach {
public static void main(String[] args) {
List names = Arrays.asList("Justin", "Monica", "Irene");
forEach(names);
forEach(new HashSet(names));
forEach(new ArrayDeque(names));
}
public static void forEach(Iterable iterable) {
for(Object o : iterable) {
System.out.println(o);
}
}
}
實(shí)際上秽荞,增強(qiáng)式for循環(huán)是編譯器的蜜糖骤公,實(shí)際代碼會展開為:
public static void forEach(Iterable iterable) {
Object o;
for(Iterator i\$ = iterable.iterator(); i\$.hasNext(); System.out.println(o)) {
o = i\$.next();
}
}
可以看到實(shí)際還是調(diào)用iterator方法。
由于iterable接口的引進(jìn)扬跋,導(dǎo)致所有實(shí)現(xiàn)了這個接口的方法阶捆,都可以iterator,看下面這個例子:
package Collection;
import java.util.Iterator;
public class IterableString implements Iterable<Character> {
private String original;
public IterableString(String original) {
this.original = original;
}
public static void main(String[] args) {
IterableString str = new IterableString("Justin");
for(Character c : str) {
System.out.println(c);
}
// TODO Auto-generated method stub
}
@Override
public Iterator<Character> iterator() {
// TODO Auto-generated method stub
return new InnerIterator();
}
private class InnerIterator implements Iterator<Character> {
private int index;
public boolean hasNext() {
return index < original.length();
}
public Character next() {
Character c = original.charAt(index);
index++;
return c;
}
public void remove() {}
}
}
查看編譯器,我們發(fā)現(xiàn)編譯器做了這些事:
Character c;
for(Iterator iterator = str.iterator(); iterator.hasNext();
System.out.println(c))
c = (Character)iterator.next();