java之Iterator

来源:互联网 发布:linux vi下查找字符串 编辑:程序博客网 时间:2024/05/14 13:47

1.概念

Iterator接口
迭代对于我们搞Java的来说绝对不陌生。我们常常使用JDK提供的迭代接口进行Java集合的迭代。

Iterator iterator = list.iterator();        while(iterator.hasNext()){            String string = iterator.next();              //do something        }

迭代其实我们可以简单地理解为遍历,是一个标准化遍历各类容器里面的所有对象的方法类,它是一个很典型的设计模式。Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。 在没有迭代器时我们都是这么进行处理的。如下:

对于数组我们是使用下标来进行处理的:

 int[] arrays = new int[10];   for(int i = 0 ; i < arrays.length ; i++){        int a = arrays[i];          //do something   }

对于ArrayList是这么处理的:

  List<String> list = new ArrayList<String>();   for(int i = 0 ; i < list.size() ;  i++){        String string = list.get(i);        //do something    }

对于这两种方式,我们总是都事先知道集合的内部结构,访问代码和集合本身是紧密耦合的,无法将访问逻辑从集合类和客户端代码中分离出来。同时每一种集合对应一种遍历方法,客户端代码无法复用。 在实际应用中如何需要将上面将两个集合进行整合是相当麻烦的。所以为了解决以上问题,Iterator模式腾空出世,它总是用同一种逻辑来遍历集合。使得客户端自身不需要来维护集合的内部结构,所有的内部状态都由Iterator来维护。客户端从不直接和集合类打交道,它总是控制Iterator,向它发送”向前”,”向后”,”取当前元素”的命令,就可以间接遍历整个集合。

2.方法

Iterator接口也是Java集合框架的成员,但它与Collection系列、Map系列的集合不一样:Collection系列集合、Map系列集合主要用于盛装其他对象,而Iterator则主要用于遍历(即迭代访问)Collection集合中的元素,Iterator对象也被称为迭代器。
Iterator接口里定义了如下4个方法:
 –boolean hasNext():如果被迭代的集合还元素没有被遍历,则返回true。
 –Object next():返回集合里下一个元素。
 –void remove() :删除集合里上一次next方法返回的元素
 –void forEachRemaining(Consumer action),这是Java 8为Iterator新增的默认方法,该方法可使用Lambda表达式来遍历集合元素。

3.实例

    public static void main(String[] args) {        // 创建集合、添加元素的代码与前一个程序相同        HashSet books = new HashSet();        //List books = new ArrayList();        //Collection books = new HashSet();        books.add("轻量级Java EE企业应用实战");        books.add("疯狂Java讲义");        books.add("疯狂Android讲义");        // 获取books集合对应的迭代器        Iterator it = books.iterator();        while(it.hasNext())        {            // it.next()方法返回的数据类型是Object类型,因此需要强制类型转换            String book = (String)it.next();            System.out.println(book);            if (book.equals("疯狂Java讲义"))            {                // 从集合中删除上一次next方法返回的元素                it.remove();            }            // 对book变量赋值,不会改变集合元素本身            book = "测试字符串";   //①        }        System.out.println(books);    }}

3.2.

0 0