Java迭代

这篇具有很好参考价值的文章主要介绍了Java迭代。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

迭代(iterate):简单来说, 它就是一个循环。 集合框架中的Iterator接口定义了迭代器的功能, 迭代器的用途是遍历集合(容器) 中的所有元素。

1. 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());
    }
}
import java.util.ArrayList;
import java.util.Iterator;

class Test {
    private ArrayList<String> names;

    Test() {
        names = new ArrayList<String>();
        names.add("zhang");
        names.add("wang");
        names.add("li");
        names.add("zhao");
    }

    public void print() {
        // 获取迭代器
        Iterator<String> it = names.iterator();
        // 输出集合中的第一个元素
        System.out.println(it.next());
    }

    public void show() {
        // 输出所有元素
        Iterator<String> it = names.iterator();
        while(it.hasNext()) {
            System.out.println(it.next());
        }
    }

    public void remove() {
        Iterator<String> it = names.iterator();
        while(it.hasNext()) {
            if(it.next().equals("zhang"))
                it.remove();
        }
        System.out.println(names);
    }
}

public class App {
    public static void main(String[] args) {
            new Test().print();
            System.out.println("-----------");
            new Test().show();
            System.out.println("-----------");
            new Test().remove();
    }
}

注意:Java 迭代器是一种单向遍历机制,即只能从前往后遍历集合中的元素,不能往回遍历。同时,在使用迭代器遍历集合时,不能直接修改集合中的元素,而是需要使用迭代器的 remove() 方法来删除当前元素。

2. 迭代器与for…each循序

Java 5 引入了 for...each 循环, 它天生就是为迭代器而设计的, 只要集合类实现了Iterable接口, 就可以使用 for...each" 循环, 而Collection这一系的集合类都实现了Iterable接口, 所以都可以应用for...each 循环。这个东西呢在C++中叫区间for循环,当然,在Java中也可以这样称谓它。

public class App {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("111");
        list.add("222");
        list.add("333");
        list.add("444");

		// for...each循环
        for(String str: list) {
            System.out.println(str);
        }
    }
}

当然了,如果我们自己写的类实现了Iterable接口, 那么它也可以应用“for…each”循环。

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);
    }
}
class MyList implements Iterable<Integer> {
    @Override
    public Iterator<Integer> iterator() {
        return new Iterator<Integer>() {
            private int[] arr = new int[] { 2, 4 , 5, 232, 121 };
            private int pos = 0;

            @Override
            public boolean hasNext() {
                return pos < arr.length;
            }

            @Override
            public Integer next() {
                return arr[pos++];
            }
        };
    }
}

public class App {
    public static void main(String[] args) {
        MyList list = new MyList();

        for(Integer num: list) {
            System.out.print(num + " ");
        }
    }
}

3. forEach()方法

Java8为Iterable接口新增了forEach()方法默认方法。可以在实现Iterable接口的对象上调用forEach()方法。

public class App {
    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<String>();
        list.add("111");
        list.add("222");
        list.add("333");
        list.add("444");

        list.forEach(elem -> System.out.print(elem + " ")); // 使用lambda表达式传参
        System.out.println("");
        list.forEach(System.out::println);                  // 使用方法引用传参
    }
}

4. ListIterator接口

实现Iterator接口的迭代器只能朝着一个方向遍历集合中的元素, 在大多数情况下, 这已经能满足我们的需求了, 但在有些情况下, 我们也希望能够按任一方向遍历集合, 并可以在迭代期间修改集合, 为此, 集合框架中给出了ListIterator接口。

public class App {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.addAll(Arrays.asList(1, 2, 3, 4, 5));

        ListIterator<Integer> lsIt = list.listIterator();

        System.out.println("正向遍历:> ");
        while(lsIt.hasNext()) {
            System.out.print(lsIt.next() + " ");
        }
        System.out.println(lsIt.nextIndex());       // 5
        System.out.println("\n------------------");

        System.out.println("反向遍历:> ");
        while(lsIt.hasPrevious()) {
            System.out.print(lsIt.previous() + " ");
        }
        System.out.println("\n------------------");

        /*
        * nextIndex:>       返回后续调用next()方法所返回的元素的索引位置; 如果迭代器在列表结尾, 则返回列表的大小;
        * previousIndex:>   返回... previous() ...; 如果迭代器在列表开始, 则返回-1;
        * */
        System.out.println("迭代器索引位置:> ");
        System.out.println(lsIt.nextIndex());       // 0
        System.out.println(lsIt.previousIndex());   // -1

        while(lsIt.hasNext()) {
            lsIt.next();
        }
        System.out.println("索引位置:> ");
        System.out.println(lsIt.nextIndex());       // 5
    }
}

Java迭代文章来源地址https://www.toymoban.com/news/detail-428601.html

到了这里,关于Java迭代的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【 java 集合】使用迭代器 Iterator 遍历集合

    💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜 📝 个人主页:馆主阿牛🔥 🎉 支持我:点赞👍+收藏⭐️+留言📝 📣 系列专栏:java 小白到高手的蜕变🍁 💬格言:要成为光,因为有怕黑的人!🔥 上两篇文章总结了集合体系以及Collection常用方法,本节我们来

    2024年02月07日
    浏览(53)
  • java -- 异常处理、Collection、Iterator迭代器、泛型

    Java异常处理的五个: try、catch、finally、throw、throws 在编写程序时,我们必须要考虑程序出现问题的情况 当调用方法使用接受到的参数时,首先需要先对参数数据进行合法的判断,数据若不合法,就应该告诉调用者,传递合法的数据进来。这时需要使用抛出异常的方式

    2023年04月08日
    浏览(52)
  • java常见面试题:什么是迭代器模式(Iterator Pattern)?如何实现迭代器模式?

    迭代器模式(Iterator Pattern)是设计模式中的一种,它提供了一种顺序访问一个聚合对象(如列表、集合等)中各个元素的方法,而又不需要暴露该对象的内部表示。使用迭代器模式,可以方便地遍历一个聚合对象的所有元素,而不需要了解该对象的底层结构。 迭代器模式主

    2024年01月18日
    浏览(55)
  • 🔥🔥Java开发者的Python快速进修指南:迭代器(Iterator)与生成器

    这一篇内容可能相对较少,但是迭代器在Java中是有用处的。因此,我想介绍一下Python中迭代器的使用方法。除了写法简单之外,Python的迭代器还有一个最大的不同之处,就是无法直接判断是否还有下一个元素。我们只能通过捕获异常或使用for循环来退出迭代,这点让我感到十

    2024年02月05日
    浏览(52)
  • 【设计模式——学习笔记】23种设计模式——迭代器模式Iterator(原理讲解+应用场景介绍+案例介绍+Java代码实现)

    编写程序展示一个学校院系结构: 需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系 【传统方式】 将学院看做是学校的子类,系是学院的子类,小的组织继承大的组织 分析: 在一个页面中展示出学校的院系组成,一个学校有多个

    2024年02月14日
    浏览(42)
  • C++迭代器(STL迭代器)iterator详解

    要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。 迭代器按照定义方式分

    2024年02月03日
    浏览(45)
  • Python迭代器(Iterator)

    迭代是访问集合元素的一种方式 迭代器是一个可以记住遍历位置的对象。迭代器对象从第一个元素开始访问,直到所有的元素被访问结束。迭代器只能往前不会后退。 能用for循环遍历的对象 for循环的过程可以通过上面的iter()和next()函数来实现,即: 1、先调用iter(),将nums当

    2024年02月15日
    浏览(40)
  • 迭代器 Iterator

    迭代器是一种设计模式,它用于遍历集合或容器中的元素,能够访问集合的元素而无需关心集合的内部结构: 特点: 封装集合访问 :迭代器封装了对集合元素的访问,通过迭代器访问集合中的元素,而无需了解集合的内部结构或实现方式。 统一接口 :迭代器提供了一致的

    2024年02月08日
    浏览(47)
  • JS - iterator(迭代器)

    一、 概念        JavaScript原有表示“集合”的数据结构,主要是数组(\\\' Array \\\')和对象(\\\' Object \\\' ),ES6又添加了Map和Set。这样就有了四种数据集合,用户还可以组合使用它们,定义自己的数据结构,比如数组的成员是Map,Map的成员是对象。这样就需要一种统一的接口机制,

    2024年02月07日
    浏览(48)
  • 递归(recurse)与迭代(iteration)

    递归,在数学与计算机科学中,是指在方法的定义中使用方法自身。也就是说,递归算法是一种 直接或者间接调用自身方法 的算法。简言之:在定义自身的同时又出现自身的直接或间接调用。 注意: 递归必须要有一个退出的条件! 递归算法解决问题的特点: 1)递归就是方

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包