Java迭代

news2024/11/26 4:52:37

迭代(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
    }
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/471754.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zynq-7000、FMQL45T900的GPIO控制(一)-----SDK配置GPIO普通输入输出模式,以及GPIO编号

Zynq-7000系列GPIO排布如下图所示&#xff0c;著名手册ug585第14章&#xff0c;第一个图&#xff0c;这图很清晰的表明&#xff0c;一共54个MIO&#xff0c;64个EMIO&#xff0c;所有这些IO共分为4个bank&#xff0c;其中 Bank0 32bit —>> MIO[0:31] Bank1 22bit —…

Java版本电子招标采购系统源代码—企业战略布局下的采购寻源

智慧寻源 多策略、多场景寻源&#xff0c;多种看板让寻源过程全程可监控&#xff0c;根据不同采购场景&#xff0c;采取不同寻源策略&#xff0c; 实现采购寻源线上化管控&#xff1b;同时支持公域和私域寻源。 询价比价 全程线上询比价&#xff0c;信息公开透明&#xff0c;可…

Ubuntu 安装和配置 Samba服务开启共享文件夹

1、 客户端&#xff1a;windows10 服务端&#xff1a;ubuntu18.04 目的&#xff1a;从ubuntu上共享一个文件夹给windows访问 2、安装Sanba sudo apt install samba 3、查看版本号验证安装是否成功 smbd --version 4、创建一个文件夹&#xff0c;用来共享 sudo mkdir /…

拼多多商品数据如何通过api接口获取

要从拼多多获取商品数据&#xff0c;可以使用拼多多提供的API接口。首先需要注册一个拼多多开放平台的开发者账号&#xff0c;然后创建一个应用程序&#xff0c;获取应用程序的app_id和app_secret&#xff0c;以在API请求中进行身份验证。 以下是一些获取拼多多商品数据的常用…

Java集合——Map接口学习总结

一、HashMap实现类 1.常用方法 增加&#xff1a;put(K key, V value)删除&#xff1a;clear() remove(Object key)修改&#xff1a;查看&#xff1a;entrySet() get(Object key) keySet() size() values()判断&#xff1a;containsKey(Object key) containsValue(Object value…

DateFormat使用时需要注意:多线程下需要特殊处理

前言 工作或学习过程中难免会接触到时间&#xff08;Date&#xff09;相关的内容&#xff0c;比如String类型转为Date类型&#xff0c;或者Date类型转为String类型&#xff0c;jdk为我们提供了一套完善的日期格式化工具&#xff0c;DateFormat类&#xff0c;使用者可以使用该接…

MECE原则

MECE原则 MECE原则|是麦肯锡咨询顾问芭芭拉•明托在《金字塔原理》中提出的一个思考工具。 原则介绍 它是Mutually Exclusive CollectivelyExhaustive的缩写&#xff0c;意思是 “相互独立&#xff0c;完全穷尽〞&#xff0c;也常被称为〞不重叠&#xff0c;不遗漏”。应用MEC…

MJ基础入门之注册:超详细注册 Midjourney 及使用方法

如何注册并使用 Midjourney Midjourney是一款优秀的AI图像生成工具&#xff0c;它的综合能力十分强大且易于上手。使用Midjourney&#xff0c;您可以在一分钟内生成4张图像&#xff0c;这是非常快的。不仅如此&#xff0c;国外的很多图像创作者都在使用Midjourney&#xff0c;并…

最值得学的编程语言是哪个?

如果让我推荐的话&#xff0c;我肯定首选是python啦&#xff01; 编程语言是一个计算机的概念&#xff0c;在我们有了计算机以后&#xff0c;想让它帮助我们做事情&#xff0c;就要通过计算机语言和它进行对话、交互&#xff0c;计算机语言能够被计算机所执行&#xff0c;完成…

电脑高效率工作、学习工具软件推荐

本文介绍在学习、工作时&#xff0c;实测很好用、明显提高工作效率的几个免费电脑软件与小工具。 1 Microsoft To Do 官方网站&#xff1a;https://todo.microsoft.com/tasks/ Microsoft To Do是一款由Microsoft公司开发的待办事项管理应用程序。它提供了一个简单易用的界面&a…

你买票了吗?五一火车票发售量创历史新高,车票总发售2209万张票

五一劳动节已经成为了除春节国庆节外最隆重的节日&#xff0c;是全国性的庆祝节日。在这个节日里&#xff0c;人们可以通过旅游、购物、娱乐等方式来放松身心&#xff0c;充满活力地迎接新的挑战。同时&#xff0c;五一假期也成为了国内外客流量最大的旅游黄金周之一&#xff0…

如何利用 GPT 开发智能应用?微软提出这九大原则

毫无疑问&#xff0c;GPT 的出现以日新月异的速度改写了软件开发的工作方式。 兴奋&#xff0c;也许也有点焦虑。作为开发人员&#xff0c;如何在 GPT 时代与人工智能协作&#xff1f;在「万物皆有副驾驶」的年代&#xff0c;如何划定分工边界&#xff0c;让 GPT 成为开发人员…

【测试开发】突破瓶颈必学技能——什么是k8s的核心概念?

目录 Docker 和K8s k8s中的重要概念 Master 节点 Node 节点 集群&#xff08;Cluster&#xff09; 标签&#xff08;Label&#xff09; 命名空间&#xff08;Namespace&#xff09; 容器组&#xff08;Pod&#xff09; 无状态部署&#xff08;Deployment&#xff09;…

车联网V2X通信技术及应用介绍

摘要&#xff1a; V2X技术影响用户体验的主要系统指标有延时时间、可靠性、数据速率、通信覆盖范围移动性、用户密度、安全性等。 1、车联网体系 车联网是物联网在交通这个特殊行业的典型应用。在车联网体系参考模型中主要包括三层&#xff1a;数据感知层、网络传输层和应用层…

【Git 入门教程】第五节、Git远程仓库

Git是一种分布式版本控制系统&#xff0c;它允许开发者在不同计算机之间协作并共享代码。在本文中&#xff0c;我们将介绍如何以Git为基础进行远程协作。其中包括克隆仓库、推送代码、拉取代码等操作。 一、克隆仓库 要协作开发一个Git项目&#xff0c;需要从服务器上获取该项…

微软开源AI修图工具让老照片重现生机

GitHub - microsoft/Bringing-Old-Photos-Back-to-Life: Bringing Old Photo Back to Life (CVPR 2020 oral) 支持划痕修复&#xff0c;以及模型训练。 Old Photo Restoration (Official PyTorch Implementation) Project Page | Paper (CVPR version) | Paper (Journal vers…

华纳云:怎么用shell脚本发送http请求

本篇内容介绍了“怎么用shell脚本发送http请求”的有关知识&#xff0c;在实际案例的操作过程中&#xff0c;不少人都会遇到这样的困境&#xff0c;接下来就让小编带领大家学习一下如何处理这些情况吧&#xff01;希望大家仔细阅读&#xff0c;能够学有所成&#xff01; 简述&…

Go官方指南(五)并发

Go 程 Go 程&#xff08;goroutine&#xff09;是由 Go 运行时管理的轻量级线程。 go f(x, y, z) 会启动一个新的 Go 程并执行 f(x, y, z) f, x, y 和 z 的求值发生在当前的 Go 程中&#xff0c;而 f 的执行发生在新的 Go 程中。 Go 程在相同的地址空间中运行&#xff0c…

鸿蒙Hi3861学习三-第一个实例程序Hello_world

一、简介 前两章介绍了环境搭建、烧录和编译。这一节&#xff0c;来介绍实现第一个经典代码“hello world”。 先介绍小熊派的目录结构&#xff0c;该目录结构延续了OpenHarmony官方目录结构。 二、实操 1.搭建代码架构 1).新建项目文件夹hello_world cd bearpi-hm_nano/appli…

【前端笔记】前端包管理工具和构建打包工具介绍之npm、yarn、webpack、vite

一、NPM包管理工具 1.1、什么是NPM NPM&#xff08;Node Package Manager&#xff09;是node包管理器&#xff0c;是node.js默认采用的软件包管理系统&#xff0c;使用JavaScript语言编写。包管理可以理解为依赖管理&#xff0c;有一个npm包管理仓库&#xff0c;当我们执行np…