实现了迭代器方法的类,就可以使用foreach方法来循环输出,比如Collection类(集合List等)
1.List
package iterator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TestIterator {
public static void main(String[] args) {
List <String>list=new ArrayList<String>();
String str="Luling is a beautiful girl";
Collections.addAll(list,str.split(" "));
for(String cha:list){
System.out.println(cha);
}
}
}
2.随意一个类来实现Iterable接口
package iterator;
import java.util.Iterator;
public class TestIterator2 implements Iterable<String> {
String str="Luling is a good girl";
protected String[] words=str.split(" ");
private int index=0;
@Override
public Iterator<String> iterator() {
return new Iterator<String>(){
@Override
public boolean hasNext() {
return index<words.length;
}
@Override
public String next() {
return words[index++];
}
};
}
public static void main(String[] args) {
TestIterator2 testIterator2=new TestIterator2();
for(String str2:testIterator2){
System.out.println(str2);
}
}
}
3.使用迭代器来逆序输出单词:
package iterator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.*;
class IterableClass1<T> extends ArrayList<T> {// 这个类不能使用public修饰,一个文件中只有一个外部类是public修饰的。
public IterableClass1(Collection<T> c) {
super(c);
}// 这里就是传入一个Collection类,比如List类,然后来创建这样一个对象,同时赋值
int index = size() - 1;// 这里可以使用ArrayList的静态方法size()-1
public Iterable<T> reverse() {
return new Iterable<T>() {
public Iterator<T> iterator() {
return new Iterator<T>() {
@Override
public boolean hasNext() {
return index >= 0;
}
public T next() {
return get(index--);// 这里取元素可以使用ArrayList中的get方法来获得元素
}
};/* 使用匿名内部类,这里相当于是新建了一个对象,所以是需要一个分号来结束一句话 */
}
};
}
}
public class IterableClass {
public static void main(String[] args) {
IterableClass1 iterableClass1 = new IterableClass1(Arrays.asList("Luling is leaning English".split(" ")));
for (Object str : iterableClass1) {
System.out.print(str + "..");
}
System.out.println();
Iterable reverseList = iterableClass1.reverse();
for (Object str2 : reverseList) {//在使用这种foreach方式的时候,其实是在调用hasNext()和next()。
System.out.print(str2 + " .. ");
}
}
}
注意:对于泛型,如果类中使用到了<T>,这种,必须在新建类后边声明这个泛型类。
但是如果类中直接使用的是<String>这种已经确定的类型,就不需要在新建类时候声明泛型类。
比如:
package iterator;
import java.util.ArrayList;
import java.util.Collection;
import java.util.*;
class IterableClass1 extends ArrayList {// 这个类不能使用public修饰,一个文件中只有一个外部类是public修饰的。
public IterableClass1(Collection<String> c) {
super(c);
}// 这里就是传入一个Collection类,比如List类,然后来创建这样一个对象,同时赋值
int index = size() - 1;// 这里可以使用ArrayList的静态方法size()-1
public Iterable<String> reverse() {
return new Iterable<String>() {
public Iterator<String> iterator() {
return new Iterator<String>() {
@Override
public boolean hasNext() {
return index >= 0;
}
public String next() {
return (String) get(index--);// 这里取元素可以使用ArrayList中的get方法来获得元素
}
};/* 使用匿名内部类,这里相当于是新建了一个对象,所以是需要一个分号来结束一句话 */
}
};
}
}
public class IterableClass {
public static void main(String[] args) {
IterableClass1 iterableClass1 = new IterableClass1(Arrays.asList("Luling is leaning English".split(" ")));
for (Object str : iterableClass1) {
System.out.print(str + "..");
}
System.out.println();
Iterable reverseList = iterableClass1.reverse();
for (Object str2 : reverseList) {//在使用这种foreach方式的时候,其实是在调用hasNext()和next()。
System.out.print(str2 + " .. ");
}
}
}