Iterable接口包含一个能够产生Iterator的iterator()方法,并且Iterable接口被foreach用来在序列中移动,意思就是想要将一个类用在foreach语句中它就要实现Iterable.
package com.zhu.foreach;
import java.util.Iterator;
public class ForEachCollections implements Iterable<String>{
String words[]="i like java very much".split(" ");
@Override
public Iterator<String> iterator() {
// TODO Auto-generated method stub
return new Iterator(){
private int index=0;
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return index<words.length;
}
@Override
public String next() {
// TODO Auto-generated method stub
return words[index++];
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
};
}
public static void main(String[] args) {
for(String s:new ForEachCollections()){
System.out.println(s);
}
}
}
一个查看操作系统环境变量的示例
package com.zhu.foreach;
import java.util.Map;
public class EnvironmentVariables {
public static void main(String[] args) {
for(Map.Entry<String, String> entry:System.getenv().entrySet()){
System.out.println("key:"+entry.getKey()+" value:"+entry.getValue());
}
}
}
在默认的前向迭代器的基础上添加反向迭代的能力,因此我们不能使用覆盖,而是添加一个能够产生Iterable对象的方法。
package com.zhu.foreach;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
public class RevArrayList<T> extends ArrayList<T>{
public RevArrayList(Collection<T>c){
super(c);
}
public Iterable<T> reversed(){
return new Iterable<T>(){
@Override
public Iterator<T> iterator() {
// TODO Auto-generated method stub
return new Iterator(){
private int index=size()-1;
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
return index>-1;
}
@Override
public Object next() {
// TODO Auto-generated method stub
return get(index--);
}
@Override
public void remove() {
// TODO Auto-generated method stub
}
};
}
};
}
public static void main(String[] args) {
RevArrayList<String>revArrayList=new RevArrayList<String>(Arrays.asList("i like java very much".split(" ")));
for(String s:revArrayList){
System.out.println(s);
}
System.out.println("-------------------------------");
for(String s:revArrayList.reversed()){
System.out.println(s);
}
}
}