资讯专栏INFORMATION COLUMN

一篇文章看懂java迭代器

kyanag / 834人阅读

摘要:具体原因在后面说明是必须实现的接口,返回了一个迭代器。迭代器,可以对已知集合进行遍历操作。这里可以看出,循环最终其实是会使用方法获取迭代器,来完成遍历。

概述

迭代器,提供了在不了解集合内部实现方法的时候遍历集合的能力。可以将容器内部实现与遍历操作隔离、解耦。

使用迭代器实现一个简单集合

通过自定义一个简单集合,并在对其使用迭代器进行遍历,达到掌握迭代器的目的。

集合描述

一个简单的集合,规则如下

1、只能存放三个字符串

2、若插入第四个数据,则覆盖第一个位置。

实现接口描述 Iterable接口描述

如果想用foreach对集合遍历,则必须实现该接口。(具体原因在后面说明)

iterator():是必须实现的接口,返回了一个迭代器。

Iterator

迭代器,可以对已知集合进行遍历操作。

hasNext():必须实现,返回一个boolean表示是否有下一个值

next():必须实现,从集合中返回下一个元素。

代码实现 自定义集合
/**
 * 自定义集合
 * 功能: 只能插入三个元素, 插入第四个元素会替换集合中第一个元素
 * 实现了Iterable(可迭代)接口,必须要实现其中的iterator方法,返回一个迭代器
 **/
public class MyCollection implements Iterable {
    String value1;
    String value2;
    String value3;

    int currentValueIndex = 1;

    public String get(int index) {
        switch (index) {
            case 1: return value1;
            case 2: return value2;
            case 3: return value3;
            default: return null;
        }
    }

    /**
     * 添加一个元素, currentValueIndex为当前元素索引, 表示下一次插入的位置
     * 维护了一个只可以插入三个String的集合
     * @param value
     * @return
     */
    public boolean add(String value) {
        switch (currentValueIndex) {
            case 1: value1 = value; currentValueIndex++; break;
            case 2: value2 = value; currentValueIndex++; break;
            case 3: value3 = value; currentValueIndex-=2; break;
            default: break;
        }
        return true;
    }

    /**
     * 返回我们自己定义的集合迭代器
     * @return
     */
    @Override
    public Iterator iterator() {
        return new MyCollectionIterator(this);
    }
}
自定义迭代器

自定义了一个迭代器,可以对上面自定义集合进行遍历。

/**
 * 给我自己实现的集合实现一个迭代器
 * 必须实现的方法
 * hasNext是否有下一个元素
 * next取出下一个元素
 */
public class MyCollectionIterator implements Iterator {

    int index = 1;

    int maxIndex = 3;

    MyCollection myCollection;

    public MyCollectionIterator(MyCollection myCollection) {
        this.myCollection = myCollection;
    }

    /**
     * 如果当前指针已经指向3,就没有下一个了,返回false
     * 否则还有下一个
     * @return
     */
    @Override
    public boolean hasNext() {
        if (index > maxIndex) {
            return false;
        }
        return true;
    }

    /**
     * 取出下一个元素,指针向前移动一步
     * @return
     */
    @Override
    public String next() {
        String result = myCollection.get(index);
        index ++;
        return result;
    }

}
测试方法
public class Test {
    public static void main(String[] args) {
        MyCollection collection = new MyCollection();
        collection.add("test1");
        collection.add("test2");
        collection.add("test3");

        /**
         * 循环1,获取MyCollection的迭代器, 用while和next、hasNext遍历我们的自定义集合
         */
        Iterator iterator = collection.iterator();
        while (iterator.hasNext()) {
            String str = iterator.next();
            System.out.println(str);
        }


        /**
         * 循环2,因为我们的集合实现了Iterable接口,因此可以使用forEach循环
         * 但是foreach循环编译的结果是和循环1一模一样的代码
         */
        for (String s : collection) {
            System.out.println(s);
        }
    }
}
测试代码反编译结果

这里是上述测试代码反编译后的代码,可以看到,上面的循环2(foreach),已经被编译成了和循环1一样的结构。这里可以看出,foreach循环最终其实是会使用iterator()方法获取迭代器,来完成遍历。因此如果想使用foreach循环,则必须实现Iterable接口。

public class Test {
    public Test() {
    }

    public static void main(String[] args) {
        MyCollection collection = new MyCollection();
        collection.add("test1");
        collection.add("test2");
        collection.add("test3");
        Iterator iterator = collection.iterator();

        while(iterator.hasNext()) {
            String str = (String)iterator.next();
            System.out.println(str);
        }

        Iterator var5 = collection.iterator();

        while(var5.hasNext()) {
            String s = (String)var5.next();
            System.out.println(s);
        }

    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74289.html

相关文章

  • 后端技术 - 收藏集 - 掘金

    摘要:理解迭代对象迭代器生成器后端掘金本文源自作者的一篇博文,原文是,俺写的这篇文章是按照自己的理解做的参考翻译。比较的是两个对象的内容是后端掘金黑魔法之协程异步后端掘金本文为作者原创,转载请先与作者联系。 完全理解关键字with与上下文管理器 - 掘金如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 with 关键字的语句,它通常用在什么场景呢?今天就来说说 with 和 上下...

    oujie 评论0 收藏0
  • Java NIO详解

    摘要:前言本篇主要讲解中的机制和网络通讯中处理高并发的分为两块第一块讲解多线程下的机制第二块讲解如何在机制下优化资源的浪费服务器单线程下的机制就不用我介绍了,不懂得可以去查阅下资料那么多线程下,如果进行套接字的使用呢我们使用最简单的服务器来帮助大 前言 本篇主要讲解Java中的IO机制和网络通讯中处理高并发的NIO 分为两块:第一块讲解多线程下的IO机制第二块讲解如何在IO机制下优化CPU资...

    rickchen 评论0 收藏0
  • Java进阶之路

    摘要:探索专为而设计的将探讨进行了何种改进,以及这些改进背后的原因。关于最友好的文章进阶前言之前就写过一篇关于最友好的文章反响很不错,由于那篇文章的定位就是简单友好,因此尽可能的摒弃复杂的概念,只抓住关键的东西来讲,以保证大家都能看懂。 周月切换日历 一个可以进行周月切换的日历,左右滑动的切换月份,上下滑动可以进行周,月不同的视图切换,可以进行事件的标记,以及节假日的显示,功能丰富 Andr...

    sushi 评论0 收藏0
  • ES6 迭代简介

    摘要:简单介绍下规范里面迭代器相关的概念。接口指定迭代器对象必须实现一个方法,如下示例伪代码。方法是否接受参数,在规范中并不严格限定,取决于实现当前这个迭代器的对象。表示迭代终结,后续再调用当前迭代器的方法,返回的对象一律为。 简单介绍下 ES6 规范里面迭代器(Iterator)相关的概念。最近为啥会看到迭代器,是因为看了 fetch 相关的 Headers 接口,为了实现下 Header...

    mingde 评论0 收藏0
  • EOS入门指南PART7——如何操作multi_index

    摘要:比如,第一张图中,如果传入的参数为,那就可以找出所有为的数据了,放入迭代器里。每次小的遍历结束是,迭代器,表示继续访问迭代器中的下一行。 上一章我们学习了对智能合约开发来说至关重要的第一步: 知道了RAM、multi_index和EOS数据库各是什么以及它们之间的关系; 知道了multi_index是内存数据库的入口; 了解了multi_index内部的结构长什么样子; 今天这...

    用户84 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<