Collection 集合的遍历

Collection集合的遍历方式主要有三种:

        迭代器遍历

        增强for遍历

        Lambda表达式遍历

 

我们平时最常用到的 普通for遍历 怎么不见了呢?

        这是因为普通for遍历只能用在 List 集合中,我们还需要考虑到 无索引 的 Set 结合 

 

迭代器遍历

 迭代器 有一个最大的特点 -- 不依赖索引 ,因此 Set 集合也可以使用

迭代器在Java中的类是 Iterator ,迭代器是集合专用的遍历方式

Collection中有一个方法 Iterator<E> iterator() --  返回此集合中元素的迭代器

Iterator中的常用方法

  • boolean hasNext() --  判断当前位置是否有元素可以被取出
  • E next(): -- 获取当前位置的元素,将迭代器对象移向下一个索引位置  

加下来看案例

public class IteratorDemo1 {public static void main(String[] args) {//创建集合对象Collection<String> c = new ArrayList<>();//添加元素c.add("hello");c.add("world");c.add("java");c.add("javaee");//Iterator<E> iterator():返回此集合中元素的迭代器,通过集合的iterator()方法得到Iterator<String> it = c.iterator();//用while循环改进元素的判断和获取while (it.hasNext()) {String s = it.next();System.out.println(s);}}
}

迭代器遍历完毕后,不会复位,如果要再次遍历,就再重新获取一个迭代器对象

我们知道,当用 普通for 对集合进行遍历删除时(如:删除集合中的所有 "A" 元素),容易出错

如果是迭代器,就不会出现该问题,如下

public class IteratorDemo2 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();list.add("a");list.add("b");list.add("b");list.add("c");list.add("d");Iterator<String> it = list.iterator();while(it.hasNext()){String s = it.next();if("b".equals(s)){//指向谁,那么此时就删除谁.it.remove();}}System.out.println(list);}
}

增强for遍历(foreach)

增强for的底层就是迭代器,为了简化迭代器代码的书写

所有的单列结合 和 数组 才能用增强for遍历,双列集合不行 

使用方法如下:

public class MyCollectonDemo1 {public static void main(String[] args) {ArrayList<String> list =  new ArrayList<>();list.add("a");list.add("b");list.add("c");list.add("d");list.add("e");list.add("f");//1,数据类型一定是集合或者数组中元素的类型//2,str仅仅是一个变量名而已,在循环的过程中,依次表示集合或者数组中的每一个元素//3,list就是要遍历的集合或者数组for(String str : list){System.out.println(str);}}
}

注意:修改增强for中的变量,不会改变集合中原本的数据,如下代码

public class MyCollectonDemo1 {public static void main(String[] args) {ArrayList<String> list =  new ArrayList<>();list.add("a");list.add("b");list.add("c");for(String str : list){str="d";}}
}

结束后,list中的值仍然为 "a","b","c" ,此处的str可以类比形参的概念

Lambda表达式遍历

利用forEach方法,再结合lambda表达式的方式进行遍历  (注意此处forEach方法与增强for遍历的foreach区分) 

我们看下 ArrayList 的forEach方法源码

我们可以看到入参是Consumer,我们继续追踪

我们可以看到 Consumer 中有@FunctionInterface注解,表明是函数式接口,因此我们可以使用lambda表达式,并要实现 accept 方法

我们再看ArrayList的forEach方法源码,核心的代码就是一个 普通for(其他集合的实现方式不一定是),在 for 中逐个遍历出元素,然后传给 accept 方法,在accept中对元素逐个进行操作

 因此,使用方法如下

public class A07_CollectionDemo7 {public static void main(String[] args) {Collection<String> coll = new ArrayList<>();coll.add("zhangsan");coll.add("lisi");coll.add("wangwu");coll.forEach(s -> System.out.println(s));}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聊聊用户故事的估算和拆解

这是鼎叔的第六十七篇原创文章。行业大牛和刚毕业的小白&#xff0c;都可以进来聊聊。 欢迎关注本专栏和微信公众号《敏捷测试转型》&#xff0c;星标收藏&#xff0c;大量原创思考文章陆续推出。 对于Scrum和用户故事实践的最大难点&#xff0c;我相信是如何估算用户故事的大…

react报错信息

报错信息 render函数里dom不能直接展示obj对象 取变量记得要有{} https://segmentfault.com/q/1010000009619339 这样在写的时候就已经执行方法了&#xff0c;所以此处用箭头函数&#xff08;&#xff09;》{}才会在点击时执行或者 遍历数据使用map来遍历&#xff0c;使用forea…

Vue项目中你是如何解决跨域的呢?

一、跨域是什么 跨域本质是浏览器基于同源策略的一种安全手段 同源策略&#xff08;Sameoriginpolicy&#xff09;&#xff0c;是一种约定&#xff0c;它是浏览器最核心也最基本的安全功能 所谓同源&#xff08;即指在同一个域&#xff09;具有以下三个相同点 协议相同&…

小程序 已被代码依赖分析忽略,无法被其他模块引用。你可根据控制台中的【代码依赖分析】告警信息修改代码,或关闭【过滤无依赖文件】功能

当我们在uniapp小程序运行的过程当中可能会遇到下面的错误。 那么我们要是遇到这样的错误的时候只需要去我们的微信小程序当中的project.config.json文件当中setting里面设置“ignoreUploadUnusedFiles”: false,“ignoreDevUnusedFiles”: false然后保存&#xff0c;重新编译即…

es6 数组操作个人总结

es6 数组操作个人总结 动机数组数组生成可枚举对象转数组箭头函数筛选判断所有元素枚举循环 小结 动机 es6 &#xff0c;说白了&#xff0c;就是增强版本的 js 。。。。。嗯&#xff0c;说到底&#xff0c;还是原生 js 罢了&#xff0c;不过比原有的 js 多了一些属性、类型、指…

光伏行业中的设备自动化系统EAP:优化生产流程的重要工具

随着清洁能源的需求不断增长&#xff0c;光伏行业作为可再生能源的重要组成部分&#xff0c;正迅速发展。为了满足日益增长的市场需求&#xff0c;光伏企业需要提高生产效率、降低成本&#xff0c;并保证产品的质量和可靠性。 图.光伏面板&#xff08;pexels&#xff09; 在这…

Python面向对象学习整理(一)

一、面向对象中的几点概念 1.1 什么是类&#xff1f; 类&#xff1a;用户定义的对象原型&#xff08;prototype&#xff09;&#xff0c;该原型定义了一组可描述该类任何对象的属性&#xff0c;属性是数据成员&#xff08;类变量 和 实例变量&#xff09;和方法&#xff0c;可…

SqlSerer数据库【进阶】

六、约束 &#xff08;1&#xff09;主键约束 1.单一主键 格式: alter table 表名 add constraint 主键名 primary key (列名) go例子: alter table t_student add constraint pk_t_student primary key (stud_id) go注意:在建表的时候主键不能为空 2.复合主键 复合主键…

[分布式] Ceph实战应用

目录 一、建 CephFS 文件系统 MDS 接口服务端操作客户端操作 二、创建 Ceph 块存储系统 RBD 接口创建 Ceph 对象存储系统 RGW 接口OSD 故障模拟与恢复 一、建 CephFS 文件系统 MDS 接口 服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds creat…

Java设计模式之行为型-解释器模式(UML类图+案例分析)

目录 一、基础概念 二、UML类图 三、角色设计 四、案例分析 五、总结 一、基础概念 解释器模式是指给定一个语言&#xff08;表达式&#xff09;&#xff0c;来表示它的文法&#xff0c;并定义一个解释器&#xff0c;使用该解释器来解释语言中的句子&#xff08;表达式&a…

【文末送书 - 数据分析之pandas篇④】- DataFrame数据合并

向阳花花花花 - 个人主页 迄今所有人生都大写着失败&#xff0c;但并不妨碍我继续向前 Python 数据分析专栏 正在火热更新中 &#x1f525; 文章目录 一、concat二、append三、merge3.1 没有属性相同时3.2 只有一个属性相同时1.一对一合并2.一对多合并3.多对多合并 3.3 有多个…

Ceph 应用

Ceph 应用 一、创建 CephFS 文件系统 MDS 接口 1.服务端操作 1&#xff09;在管理节点创建 mds 服务 cd /etc/ceph ceph-deploy mds create node01 node02 node032&#xff09;查看各个节点的 mds 服务 ssh rootnode01 systemctl status ceph-mdsnode01 ssh rootnode02 syst…