天天看點

疊代器模式

不同的容器,因為使用了不同的資料結構,就注定了他們的周遊方法是不盡相同的,疊代器模式以接口+實作的方式,實作了為不同的聚合對象容器提供了相同的順序通路方法,而忽略其底層資料結構,這也成為外部疊代(借助第三方的疊代器器完成的疊代)

java内置的疊代器

疊代器模式

如上圖是java内置的疊代器的接口圖,java的容器中,很多多已經内置疊代器的實作了,我們直接可以使用

如 ArrayList的内置疊代器

如下代碼,是ArrayList的部分源碼,可以看到他已經内置疊代器了

/**
 * An optimized version of AbstractList.Itr
 */
private class Itr implements Iterator<E> {
    int cursor;       // index of next element to return
    int lastRet = -1; // index of last element returned; -1 if no such
    int expectedModCount = modCount;

    Itr() {}......
           

hash表的疊代器

Hashtable的疊代器

Hashtable的疊代器 hashtable = new Hashtable<String,String>();
hashtable.values().iterator();
hashtable.keySet().iterator();
           

HashMap的疊代器及5種周遊方式

HashMap map = new HashMap<String,String>();
map.entrySet().iterator(); 
map.keySet().iterator()
map.values().iterator();

// 先周遊key,再周遊value
for (String key : map.keySet()) {
    System.out.println(key + "  " + map.get(key));
}


java.util.Iterator<String> iterator = map.keySet().iterator();
while(iterator.hasNext()){
  String key =   iterator.next();
  map.get(key);
}


for (Map.Entry<String, String> entry : map.entrySet()) {
    System.out.println(entry.getKey() + "  " + entry.getValue());
}

java.util.Iterator<Map.Entry<String, String>> iterator1 = map.entrySet().iterator();
while(iterator1.hasNext())
{
    Map.Entry<String, String> entry=(Map.Entry<String, String>) iterator1.next();
    System.out.println("Key: "+entry.getKey()+" Value: "+entry.getValue());
}


map.forEach((k,v)-> System.out.println(k+"  "+v));
           

數組,自定義疊代器

java的數組,是沒有疊代器的, 下面自定義自己的疊代器, 其實就是實作Iterator接口,重寫抽象方法,最後添加上擷取疊代器的方法, 代碼如下

public interface Iterator {
   boolean hasNext();
   Object next();
}

@Data
public class Student {
private String name;
private  String[] houseWork ;
public Student(String name){
    this.name=name;
    houseWork = new  String[3];
    houseWork[0]="國文";
    houseWork[1]="數學";
    houseWork[2]="英語";
}

public static void main(String[] args) {
    Student lisi = new Student("李四");
    Iterator iterator = lisi.getIterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next());
    }
}

public Iterator getIterator(){
    return  new  studentIterator();
}

private  class studentIterator  implements Iterator{
    private int position;

    private studentIterator(){
        position=0;
    }
    @Override
    public boolean hasNext() {
       if (position<houseWork.length){
           return true;
       }
       return false;
    }

    @Override
    public String next() {
        String housework = houseWork[position];
        position++;
        return  housework;
    }
  }
}
           

netty的疊代器

ByteBuf byteBuf = Unpooled.wrappedBuffer(new byte[]{1, 2, 3, 4});

byteBuf.forEachByte(b->{
    System.out.println(b);
    return true;
});
           

netty的疊代器并沒有通過實作Iterator完成,如上的

forEachByte()

與普通集合的

forEach()

, 如出一轍,入參是

ByteProcessor

, 雖然沒有标注是函數式接口,但是隻有唯一的抽象方法,可以用它疊代周遊每一個元素