迭代器模式

不同的容器,因为使用了不同的数据结构,就注定了他们的遍历方法是不尽相同的,迭代器模式以接口+实现的方式,实现了为不同的聚合对象容器提供了相同的顺序访问方法,而忽略其底层数据结构,这也成为外部迭代(借助第三方的迭代器器完成的迭代)

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, 虽然没有标注是函数式接口,但是只有唯一的抽象方法,可以用它迭代遍历每一个元素

posted @ 2019-07-24 20:57  赐我白日梦  阅读(439)  评论(0编辑  收藏  举报