在java编程中我会大量的使用 foreach 语法来遍历Collection对象 以及数组对象。
本文主要是解释一下foreach的实质以及如何改变 foreach遍历的行为?
point A:
foreach语句之所以能够工作是因为 在JavaSe5 中引入的Iterable接口,该接口包含一个能产生Iterator对象的iterator方法。该Iterable 接口被foreach用来在序列中移动,任何实现Iterable 的接口类都可以被foreach遍历。
实现Itreable 接口主要是 重写 iterator方法,让该方法返回一个实现 iterator接口的对象。
interface iterator{
hasNext();
next();
remove();
}
下面使用thinking in java 的一个例子来说明 怎么构建一个IterableClass
public class IterableClass implements Iterable<String>{
public Iterator<Object> iterator(){
return new Iterator<String>(){
boolean hasNext(){}
String next(){}
void remove(){}
}
}
}
point B:
闲杂假设你有一个Iterable 类 比如 ArrayList<String>对象 arrayObj,
你使用 for(String str:arrayObj)只能实现默认顺序遍历。
如果你想使用逆序遍历,就需要重写一个生产 Iterator对象到方法,并把生产的ReverIterator 对象放入foreach语法中如下:
for(String str:ReverArray.reverd()).
ex:
public class ReverArray extends ArrayList<String>{
public Iterable<String> reversed(){
return new Iterable <String>(){
public Iterator<String> iterator(){
return new Iterator<String>(){
next();hasNext();remove();
//在这里改变对应方法的行为即可
}
}
}
}
}