• 迭代器模式


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

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

  • 相关阅读:
    C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制
    如何将CKeditor编辑器的上传和thinkphp结合
    在 VisualStudio 给文件起一个带分号的文件名会怎样
    dotnet ConditionalWeakTable 的底层原理
    GitHub 的 Action 判断仅在主仓库才执行脚本
    ASP.NET Core 将文件夹内容输出为压缩包文件方法
    dotnet Microsoft.Recognizers.Text 超强大的自然语言关键词提取库
    dotnet CBB 为什么决定推送 Tag 才能打包
    WPF 通过 InputManager 模拟调度触摸事件
    如何参与 .NET 的开发和设计
  • 原文地址:https://www.cnblogs.com/ZhuChangwu/p/11240803.html
Copyright © 2020-2023  润新知