說在前面嘴纺,每天積累一點(diǎn)點(diǎn),詳情請點(diǎn)擊github
如果實(shí)現(xiàn)這個Iterable接口必須要實(shí)現(xiàn):
//java.lang.Iterable
import java.util.Iterator;
Iterator iterator();
然而如果實(shí)現(xiàn)Iterator接口浓冒,必須實(shí)現(xiàn):
import java.util.Iterator;
boolean hasNext();
T next();
在java.util.Collection
中實(shí)現(xiàn)了Iterable用于遍歷集合里的數(shù)據(jù)栽渴,因?yàn)镮terator是接口,所有實(shí)例化其子類裆蒸。
增強(qiáng)for的實(shí)現(xiàn)原理就是實(shí)現(xiàn)Iterable,Iterator接口完成遍歷集合中的對象熔萧。
使用javap -verbose 字節(jié)碼文件
更進(jìn)一步了解運(yùn)行操作:
import java.util.List;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
for (int i = 1; i < 4; i++) {
list.add(i);
}
for (Integer i : list) {
System.out.println(i);
}
Integer[] intArray = new Integer[]{1, 2, 3};
for (int i : intArray)
System.out.println(i);
}
}
然而當(dāng)用打印數(shù)組時 沒有用到迭代,而是根據(jù)其下標(biāo)取值僚祷。
適配器模式
適配器模式,將一個類的接口轉(zhuǎn)換成客戶希望的另外一個接口.Adapter模式使得原本由于接口不兼容而不能一起工作的那些類可以一起工作.
Target:所要轉(zhuǎn)換的所期待的接口
Adaptee:需要適配的類
Adapter:將源接口適配成目標(biāo)接口,繼承源接口贮缕,實(shí)現(xiàn)目標(biāo)接口.
舉個栗子:
假如給你一個Fibonacci.java,要實(shí)現(xiàn)Iterable接口進(jìn)行遍歷辙谜。
package com.sprint.generics;
import com.sprint.utils.Generator;
public class Fibonacci implements Generator<Integer> {
private int count = 0;
@Override
public Integer next() {
return fib(count++);
}
private Integer fib(int n) {
if (n < 2) return 1;
return fib(n-1) + fib(n-2);
}
}
在實(shí)現(xiàn)需求的同時,我們要遵守開閉原則
感昼,只擴(kuò)展装哆,不修改。那么適配模式將是一種不錯的策略定嗓,創(chuàng)建IterableFibonacci.java繼承Ficbonacci,并實(shí)現(xiàn)Iterable接口蜕琴。
package com.sprint.generics;
import java.util.Iterator;
public class IterableFibonacci
extends Fibonacci implements Iterable<Integer> {
private int n;
public IterableFibonacci(int count) {
n = count;
}
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
@Override
public boolean hasNext() {
return n > 0;
}
@Override
public Integer next() {
n--;
return IterableFibonacci.this.next();//繼承父類的
}
};
}
}