迭代器模式

简介: 迭代器模式

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


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

相关文章
|
存储 机器学习/深度学习 人工智能
TaoAvatar:手机拍出电影级虚拟人!阿里3D高斯黑科技让动捕设备下岗
阿里巴巴最新推出的TaoAvatar技术,通过3D高斯溅射实现照片级虚拟人实时渲染,支持多信号驱动与90FPS流畅运行,将彻底改变电商直播与远程会议体验。
1021 8
TaoAvatar:手机拍出电影级虚拟人!阿里3D高斯黑科技让动捕设备下岗
|
并行计算 前端开发 安全
【C++并发编程】std::future、std::async、std::packaged_task与std::promise的深度探索(一)
【C++并发编程】std::future、std::async、std::packaged_task与std::promise的深度探索
1079 0
|
程序员 API 计算机视觉
技术经验解读:【python自动化】02.pywin32库自动操作键鼠(保姆级代码注释)
技术经验解读:【python自动化】02.pywin32库自动操作键鼠(保姆级代码注释)
824 0
|
机器学习/深度学习 边缘计算 自动驾驶
深度学习在图像识别中的应用与挑战
【4月更文挑战第30天】 本文探讨了深度学习技术在图像识别领域的应用,并分析了当前面临的主要挑战。通过回顾卷积神经网络(CNN)的发展历程,本文阐述了深度学习如何革新图像处理领域,同时指出数据偏差、模型泛化能力和计算资源等关键问题。本研究不仅总结了现有技术的进展,还对未来的研究方向提出了展望。
|
云计算
2022阿里云国际跨境独立站品牌出海金秋论坛暨华东区青岛发布
本网讯 9月8日,主题为“2022阿里云国际跨境独立站品牌出海金秋论坛暨华东区青岛战略发布会”在山东青岛成功举办。
671 0
提示符被覆盖的问题,PS1-PS4_学习笔记
时间:2017.12.31作者:李强参考:man,info,magedu讲义,万能的internet实验环境:VMware® Workstation 12 Pro ,Centos 6.9,Centos 7.4,SecureCRT Version 8.1.4声明:以下英文纯属个人翻译,英文B级,欢迎纠正,以下内容纯属个人理解,并没有对错,只是参考,盗版不纠,才能有限,希望不误人子弟为好。
1197 0
|
Java 应用服务中间件 Linux