首页 > 其他分享 >被用到炉火纯清的迭代器模式

被用到炉火纯清的迭代器模式

时间:2023-05-30 12:07:00浏览次数:34  
标签:java iterator Iterator 纯清 list public 炉火 迭代


0x01:迭代器模式简介

Java中可以说已经把迭代器模式用到了极致,每一个集合类都关联了一个迭代器类Iterator。

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示。UML类图如下:

被用到炉火纯清的迭代器模式_迭代器模式

其中,Aggregate是聚集抽象类,负责提供创建具体迭代器角色的接口;Iterator是迭代抽象类,用于定义得到开始对象、得到下一个对象、判断是否到结尾、当前对象等抽象方法,统一接口;ConcreteAggregate是具体聚集类,继承Aggregate;ConcreteIterator是具体迭代器类,继承Iterator,实现开始、下一个、是否结尾、当前对象等方法。具体角色说明:

  • Iterator(迭代器):迭代器定义访问和遍历元素的接口;
  • ConcreteIterator (具体迭代器):具体迭代器实现迭代器接口,对该聚合遍历时跟踪当前位置;
  • Aggregate (聚合):聚合定义创建相应迭代器对象的接口;
  • ConcreteAggregate (具体聚合):具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例;

0x02:迭代器模式实现

抽象聚合:负责提供接口,比如定义一个类似createIterator()这样的方法,在Java集合类里一般是iterator()方法。

public interface Aggregate {

    public void add(Object object);

    public void remove(Object object);

    public Iterator iterator();

}

抽象迭代器:负责定义访问和遍历元素的接口,基本上有固定的三个方法,即first()获取第一个元素、next()访问下一个元素、hasNext()判断已经遍历到最后。

public interface Iterator {

    public Object next();    //遍历到下一个元素

    public boolean hasNext();    //是否已经遍历到尾部

    public boolean remove();    //删除当前指向的元素

}

具体聚合

public class ConcreteAggregate implements Aggregate {

    private List list = new ArrayList();

    @Override
    public void add(Object object) {
        this.list.add(object);
    }

    public void remove(Object object) {
        this.list.remove(object);
    }

    @Override
    public Iterator iterator() {
        return new ConcreteIterator(this.list);
    }

}

具体迭代器:简单的实现就是通过一个游标,在一个容器中前后移动,遍历所有它需要查看的元素

public class ConcreteIterator implements Iterator {

    private List list= new ArrayList();
    public int cursor = 0;    //定义当前游标

    public ConcreteIterator(List list) {
        this.list= list;
    }

    @Override
    public Object next() {
        Object result = null;
        if (this.hasNext()) {
            result = this.list.get(this.cursor);
            this.cursor = this.cursor + 1;
        } else {
            result = null;
        }
        return result;
    }

    @Override
    public boolean hasNext() {
        if (this.cursor == this.list.size()) {
            return false;
        }
        return true;
    }

    @Override
    public boolean remove() {
        this.list.remove(this.cursor);
        return true;
    }

}

迭代器模式测试代码

注意引入自己定义的Iterator类,而不是Java内部封装好的java.util.Iterator类。

public class Client {

    public static void main(String[] args) {
        Aggregate aggregate = new ConcreteAggregate();
        aggregate.add("java乐园");
        aggregate.add("架构师知音");
        aggregate.add("非常架构");

        //遍历
        Iterator iterator = aggregate.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }

}

0x03:JDK中的迭代器源码分析

在JDK涉及到的迭代器Iterator都与集合有关,主要相关实现在java.util包下。下面以 ArrayList 为例进行分析:

java.lang.Iterable类:表示一个可以被迭代的对象

public interface Iterable<T> {

    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    default Spliterator<T> spliterator() {
        return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

java.util.Iterator:表示抽象迭代器

public interface Iterator<E> {
    boolean hasNext();
    E next();

    default void remove() {
        throw new UnsupportedOperationException("remove");
    }

    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

java.util.Collection:表示抽象聚合对象

public interface Collection<E> extends Iterable<E> {
    
    Iterator<E> iterator();

    boolean add(E e);

    boolean remove(Object o);

    boolean addAll(Collection<? extends E> c);

    boolean removeAll(Collection<?> c);

    //其他省略
     .......

}

java.util.AbstractList.Itr:具体迭代器实现类,该类是 java.util.AbstractList 类的一个内部类

private class ListItr extends Itr implements ListIterator<E> {
        //具体代码省略
        .......
}

java.util.ArrayList:具体聚合对象

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
     //具体代码省略
     .......
}

java.util.ArrayList整体实现UML类图

被用到炉火纯清的迭代器模式_java_02


[https://www.alicharles.com/article/design-pattern/jdk-iterator-pattern/]

研读JDK源码的迭代器模式,可以非常有效的学习和理解迭代器模式。从代码上看JDK的迭代器源码比小编实现的复杂很多,但是基本原理无两。常常研读大神的源码有利于提升技术能力。


标签:java,iterator,Iterator,纯清,list,public,炉火,迭代
From: https://blog.51cto.com/u_13538361/6377691

相关文章

  • 斐波那契数列:2.迭代法
    斐波那契数列:2.迭代法#include<stdio.h>intfib(intm){if(m==1||m==2){return1;}inta=1,b=1,aw=0;while(m>=2){aw=aw+a;a=b;b=aw;m=m-1;}returnaw;}intmain(){intn;scanf("%d",&n);p......
  • #yyds干货盘点# LeetCode程序员面试金典:二叉搜索树迭代器
    1.简述:实现一个二叉搜索树迭代器类BSTIterator,表示一个按中序遍历二叉搜索树(BST)的迭代器:BSTIterator(TreeNoderoot)初始化BSTIterator类的一个对象。BST的根节点root会作为构造函数的一部分给出。指针应初始化为一个不存在于BST中的数字,且该数字小于BST中的任何元素。b......
  • OpenCASCADE曲面求交之迭代法2
    OpenCASCADE曲面求交之迭代法[email protected]朱心雄等著《自由曲线曲面造型技术》书中对曲面求交的迭代法有详细介绍,其中关于曲面迭代求交的原理介绍如下:为求得两个曲面精确的交点,Newton-Raphson迭代法得到广泛应用,该法的优点为计算精度高,速度快,在初值选择比较......
  • OpenCASCADE曲面求交之迭代法
    OpenCASCADE曲面求交之迭代法[email protected]朱心雄等著《自由曲线曲面造型技术》书中对曲面求交的迭代法有详细介绍,其中关于曲面迭代求交的原理介绍如下:为求得两个曲面精确的交点,Newton-Raphson迭代法得到广泛应用,该法的优点为计算精度高,速度快,在初值选择比较合......
  • 高硬度高纯度粉体超细研磨与分散工艺迭代,威海圆环打造氮化硅磨介领军品牌
    高硬度高纯度粉体超细研磨与分散工艺迭代,威海圆环打造氮化硅磨介领军品牌一、超细粉体材料是大国科技竞争重要的基础材料超细粉体业内通常是指从微米级、亚微米级到100纳米以上的一系列超细材料。材料被粉粹成超细粉体后,由于粉粒体积小、粒度分布窄、质量均匀,从而具有表面活性高......
  • python 迭代器
    迭代器迭代器的理解,学过Java的都是知道的,java也是都是由迭代器的,而且是一种设计思想,实际上。可以把迭代器理解成一种特殊的list+function实际上,迭代器是一个特殊的函数迭代器的特性可迭代的使用next这个内置函数来移动内部的下一个指针通过for遍历的时候实际也是调用n......
  • 代码随想录算法训练营第14天 | ● 理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代 -
     第六章二叉树part01今日内容:  ●  理论基础●  递归遍历  ●  迭代遍历●  统一迭代   详细布置   理论基础  需要了解 二叉树的种类,存储方式,遍历方式 以及二叉树的定义  文章讲解:https://programmercarl.com/%E4%BA%8C%E5%8F%89%......
  • 迭代器模式(Interator Pattern)
    一、模式动机迭代器模式(IteratorPattern)是一种使用频率非常高的行为型设计模式,迭代器用于对一个聚合对象进行遍历。通过引入迭代器可以将数据的遍历功能从聚合对象中分离出来,聚合对象只负责存储数据,而遍历数据由迭代器来完成,简化了聚合对象的设计,更符合“单一职责原则”的要求。......
  • C#的迭代器/枚举器,索引器
    1.迭代器:可使用Foreach遍历,如List,Dictionary等,其继承IEnumerable接口,并实现publicIEnumeratorGetEnumerator()方法;举例:有个动物园,其中有各种动物:publicclassZoo:IEnumerable{List<Animal>animals;publicZoo(){animals=newList<Animal>()......
  • C++ 如何快速实现一个容器的迭代器
    C++如何快速实现一个容器的迭代器引言C++的标准库中的容器都会提供迭代器,如果一个容器满足forward_range,那么这个容器一般会提供以下成员类型和函数:iteratorconst_iteratorbeginendbegincend如果该容器还满足bidirectional_range,那么该容器还会额外提供以下成员类型和......