一,介紹。
在對List遍歷時,通常有三種方式:
List<String> lists = Arrays.asList("aaa","bbb","ccc","ddd");
//第一種
for(int i = 0; i < lists.size(); i++){
System.out.println(lists.get(i));
}
//第二種
for(String str : lists){
System.out.println(str);
}
//第三種
lists.forEach(x->System.out.println(x));
第一種爲傳統的循環方式。
第三種方式是jdk1.8提供的lambda表達式。
第二種方式的循環又叫做增強for循環,在使用時比方式一方便不少,而之所以能夠這樣進行循環是因爲其實現了Iterable接口。
二,使用。
List繼承於Collection接口而Collection接口又繼承於Iterable,因此所有直接或間接繼承於Collection的類都具有增強for循環的功能。
//接口定義
public interface Collection<E> extends Iterable<E>{
//...
}
Iterable接口中有一個返回Iterator對象的iterator方法,Iterator接口中主要有兩個方法,一是判斷是否還有下一個元素的hasNext方法,一個是返回下一個元素的next方法,
interface Iterator<E>{
bool hasNext();
E next();
}
知道了它們之間的關係就可以讓我們的類也實現那樣遍歷的功能。
要求:實現倒序輸出的List
代碼如下。
class ReverseList<T> implements Iterable<T>{
private List<T> lists = new ArrayList<>();
private int n;
public ReverseList(Collection<T> c){
lists.addAll(c);
n = lists.size() - 1;
}
public int size(){
return lists.size();
}
//實現iterator方法
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
@Override
public boolean hasNext() {
return n >= 0;
}
@Override
public T next() {
return lists.get(n--);
}
};
}
}
如上所示,底層使用arrayList來存儲數據,arrayList默認輸出時是正序的,我們只需稍加改造實現Iterable接口即可,iterator方法返回一個Iterator的對象,Iterator也是個接口,此處可以通過內部類,或者像我這樣的匿名內部類的方式直接進行實現。
三,測試。
public class ReverseListTest {
public static void main(String[] args){
Collection<String> c =
Arrays.asList("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");
ReverseList<String> list = new ReverseList<>(c);
for(String str : list){
System.out.println(str);
}
}
}
結果: