zoukankan      html  css  js  c++  java
  • java迭代器

    为了从一个系列中生成连续的元素,我们可以使用java迭代器。这是对枚举界面的改进。迭代器代替了从jdk 1.2开始的枚举

    这是一个很好的实用程序集合。每个集合都是独一无二的,并且想象如果我们必须在需要迭代的时候为每个集合写自己的逻辑。相反,java强制一个集合来传递一个迭代器。

    这些漂亮的实用程序使java可爱,不是吗?

    重要注意事项:

    • 我们只能在一个方向迭代
    • 迭代只能做一次。如果你完成了系列的完成。如果我们需要重新迭代,我们应该得到一个新的迭代器。

    没有泛型的迭代器示例

    package com.javapapers;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    
    public class ExampleIterator {
    
        public static void main(String args[]){
            ArrayList animal = new ArrayList();
            animal.add("Horse");
            animal.add("Lion");
            animal.add("Tiger");
    
            Iterator animalItr = animal.iterator();
    
            while(animalItr.hasNext()) {
                String animalObj = (String)animalItr.next();
                System.out.println(animalObj);
            }
        }
    
    }

    没有泛型,Iterator返回Object,我们需要对其进行类型转换。

    使用泛型的迭代器示例

    package com.javapapers;
    
    import java.util.ArrayList;
    
    public class ExampleIterator {
    
        public static void main(String args[]){
            ArrayList animal = new ArrayList();
            animal.add("Horse");
            animal.add("Lion");
            animal.add("Tiger");
    
            for(String animalObj : animal) {
                System.out.println(animalObj);
            }
        }
    
    }

    输出:
    Horse
    Lion
    Tiger

    看起来很简单 由于我们正在使用各种泛型,所以没有明确地引用迭代器。

    可迭代和迭代器

    为了使对象可以迭代,它需要发出一个Iterator对象。要执行此合同,将使用Iterator接口。它包含一个名为iterator()的方法,它返回Iterator。因此,任何实现Iterable的类都将返回一个Iterator。

    public interface Collection <E> extends Iterable <E> {
    

    例如采取任何集合。集合是表示一系列元素的容器的接口。每个集合像ArrayList,Vector都实现了Collection等等迭代器。

    • Iterable的一个优点是,当您实现Iterable时,那些对象获得了以下支持:每个循环语法。

    使用迭代器删除元素

    • 迭代器有一个删除方法,我们可以从底层对象中删除元素。
    • 它删除迭代器返回的最后一个元素。

    迭代器和枚举接口之间的区别

    1. 在迭代器中引入了remove()方法。使用这种方法,我们可以从我们正在迭代的底层集合中删除元素。
    2. 枚举有两种方法,两种都可以在迭代器中使用。两者的方法名称缩短。

    ListIterator是一个更好的迭代器,它包含更多的实用方法,如获取元素索引和向基础对象添加元素。使用ListIterator,我们可以在两个方向进行迭代。

    ConcurrentModificationException的

    看下面的代码,它会引发ConcurrentModificationException。当我们使用迭代器时,我们无法添加或移除元素到底层集合。

    package com.javapapers;
    
    import java.util.ArrayList;
    
    public class ExampleIterator {
    
        public static void main(String args[]){
            ArrayList animal = new ArrayList();
            animal.add("Horse");
            animal.add("Lion");
            animal.add("Tiger");
    
            for(String animalObj : animal) {
                System.out.println(animalObj);
                animal.add("Hyena");
            }
        }
    }
    
    Output:
    Horse
    Exception in thread "main" java.util.ConcurrentModificationException
        at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
        at java.util.ArrayList$Itr.next(Unknown Source)
        at com.javapapers.ExampleIterator.main(ExampleIterator.java:13)
    
    

    实现我们自己的定制迭代器

    我们将创建自己的自定义类,并使其实现Iterable,以便返回一个迭代器,我们可以使用它迭代元素。

    package com.javapapers;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    
    public class AnimalIterator<String> implements Iterator<Object> {
    
        private ArrayList<?> animal;
        private int position;
    
        public AnimalIterator(Animal animalBase) {
            this.animal = animalBase.getAnimal();
        }
    
        @Override
        public boolean hasNext() {
            if (position < animal.size())
                return true;
            else
                return false;
        }
    
        @Override
        public Object next() {
            Object aniObj = animal.get(position);
            position++;
            return aniObj;
        }
    
        @Override
        public void remove() {
            animal.remove(position);
        }
    
    }
    package com.javapapers;
    
    import java.util.ArrayList;
    import java.util.Iterator;
    
    public class Animal implements Iterable<String> {
    
        private ArrayList<String> animal = new ArrayList<String>();
    
        public Animal(ArrayList animal){
            this.animal = animal;
        }
    
        public ArrayList getAnimal() {
            return animal;
        }
    
        @Override
        public Iterator<String> iterator() {
            return new AnimalIterator(this);
        }
    
    }
    package com.javapapers;
    
    import java.util.ArrayList;
    
    public class TestIterator {
    
        public static void main(String args[]) {
            ArrayList<String> animalList = new ArrayList();
            animalList.add("Horse");
            animalList.add("Lion");
            animalList.add("Tiger");
            Animal animal = new Animal(animalList);
            for (String animalObj : animal) {
                System.out.println(animalObj);
            }
        }
    }

    Output:
    Horse
    Lion
    Tiger

     
  • 相关阅读:
    使用 pandas 导出数据
    Vue -- 基础语法和使用
    Django-用户模块与权限系统相关
    rest-framework之权限组件
    rest-framework之认证组件
    rest-framework之解析器
    Markdown -语法说明
    rest-framework之APIView 序列化组件
    eggjs-对接微信公众号
    常用站点
  • 原文地址:https://www.cnblogs.com/JavaBlackHole/p/7675148.html
Copyright © 2011-2022 走看看