【Java语言】遍历List元素时删除集合中的元素

目录

前言

实现方式

1.普通实现

1.1 使用【for循环】 方式

1.2 使用【迭代器】方式

2.jdk1.8新增功能实现

2.1 使用【lambda表达式】方式

2.2 使用【stream流】方式

注意事项

1. 使用【for循环】 方式

2. 不能使用增强for遍历修改元素

总结


前言

        分享几种从List中移除元素的常用方法,【注意事项】尤其重要,很容易踩坑。


实现方式

场景:移除List集合中所有的偶数。 

1.普通实现

1.1 使用【for循环】 方式

  • 代码示例如下:
    /*** 使用【for循环】在遍历过程中移除元素* @param list* @return*/public static List<Integer> removeMethod6(List<Integer> list) {for (int i = list.size() - 1; i >= 0; i--) {Integer integer = list.get(i);if (0 == integer % 2) {list.remove(i);}}return list;}

1.2 使用【迭代器】方式

  • while循环】代码示例如下:
    /*** 使用迭代器在遍历过程中移除元素* @param list* @return*/public static List<Integer> removeMethod(List<Integer> list) {Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {Integer integer = iterator.next();if (0 == integer % 2) {iterator.remove();}}return list;}
  • for循环】代码示例如下:
  /*** 使用【增强for】在遍历过程中移除元素* @param list* @return*/public static List<Integer> removeMethod2(List<Integer> list) {for (Iterator iterator = list.iterator(); iterator.hasNext();) {Integer integer = (Integer) iterator.next();if (0 == integer % 2) {iterator.remove();}}return list;}

2.jdk1.8新增功能实现

2.1 使用【lambda表达式】方式

  • 代码示例如下:
    /*** 使用【lambda表达式】移除元素* @param list* @return*/public static List<Integer> removeMethod3(List<Integer> list) {list.removeIf(integer -> 0 == integer % 2);return list;}

2.2 使用【stream流】方式

  • 代码示例如下: 
    /*** 使用【stream流】移除元素* @param list* @return*/public static List<Integer> removeMethod4(List<Integer> list) {list = list.stream().filter(integer -> 0 == integer % 2).collect(Collectors.toList());return list;}

注意事项

1. 使用【for循环】 方式

在1.1中,为什么要从集合的最后往前遍历呢? 

        因为List底层是一个动态数组,从数组中移除一个非末尾的元素,该元素后面的元素都会动态的往前移动。如果从前往后遍历,那每移除一个元素,当前索引的元素就会发生改变,会导致有些元素遍历不到,影响结果的正确性。 例如:

package com.zhy.coll;import java.util.ArrayList;
import java.util.List;public class TestList {/*** 初始化List集合* @return*/public static List<Integer> initList(List<Integer> list){for(int i = 0; i < 10; i++) {Integer integer = (int)(Math.random() * 100);list.add(integer);}return list;}/*** 使用迭代器在遍历过程中移除元素* @param list* @return*/public static List<Integer> removeMethod5(List<Integer> list) {for (int i = 0; i < list.size(); i++) {Integer integer = list.get(i);if (0 == integer % 2) {list.remove(i);}}return list;}public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();initList(list);List<Integer> list2 = new ArrayList<Integer>();list2.addAll(list);System.out.println("初始化集合:\n\t" + list2);//方式五list2.clear();list2.addAll(list);System.out.println("使用【for循环】从前往后遍历数组,并移除集合中所有的偶数:\n\t" + removeMethod5(list2));}
}

输出结果:发现并没有正确移除集合中所有的偶数。

注:所以使用这种方式的话,一定要特别注意,用倒序遍历索引的方式。 

2. 不能使用增强for遍历修改元素

增强for只能遍历集合元素,不能对集合元素个数进行修改(包括增加和删除)会编译报错


总结

        使用普通实现方式,一目了然,但是代码行数比较多;使用1.8新增功能实现,代码就会简洁,但是在团队配合开发的场景中,如果没有了解过1.8新增特性的,可能可读性不强。方式各有优劣势,根据需求择优选择。

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

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

相关文章

基于 K8s 容器集群的容灾架构与方案

作者&#xff1a;庄宇 在设计系统架构时&#xff0c;我们必须假设任何组件和任何基础设施可能会在任何时间失效&#xff0c;例如&#xff1a;自然灾害&#xff0c;电力中断&#xff0c;网络中断&#xff0c;错误的系统变更等。为了应对挑战&#xff0c;我们必须设计合适的容灾…

在centos8中部署Tomcat和Jenkins

参考链接&#xff1a;tomcat安装和部署jenkins_jenkins和tomcat-CSDN博客 1、进入centos中 /usr/local 目录文件下 [rootlocalhost webapps]# cd /usr/local2、使用通过wget命令下下载tomcat或者直接在官网下载centos版本的包后移动到centos中的local路径下 3、下载tomcat按…

VUE3内置组件Transition的学习使用

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 更多nbcio-boot功能请看演示系统RuoYi-Nbcio亿事达企业管理平台 gitee源代码地址 后端代码&#xff1a;…

详解Postman使用

简介&#xff1a; 1.简介 PostMan&#xff0c;一款接口调试工具。 特点&#xff1a; 可以保留接口请求的历史记录 可以使用测试集Collections有效管理组织接口 可以在团队之间同步接口数据 1.简介 PostMan&#xff0c;一款接口调试工具。 特点&#xff1a; 可以保留接口请求…

从0到1入门C++编程——12 演讲比赛流程管理系统

文章目录 一、创建类并显示菜单二、退出管理系统三、开始演讲比赛四、查看往届记录五、清空比赛记录六、案例源代码 演讲比赛流程管理系统 比赛规则&#xff1a;演讲比赛共有12个人参加&#xff0c;比赛分两轮进行&#xff0c;第一轮为淘汰赛&#xff0c;第二轮为决赛。每名选手…

HTML万字学习总结

html文本标签特殊符号图片音频与视频超链接表单列表表格语义标签(布局) html文本标签 标签简介根目录规定文档相关的配置信息&#xff08;元数据元素表示文档的内容表示那些不能由其它 HTML 元相关元素&#xff08;(<base>、<link>, <script>、<style>…

今日AI:GPT-4.5意外曝光可能6月发布、UP主借AI识别情绪播放量186万、全球首个AI程序员诞生

欢迎来到【今日AI】栏目!这里是你每天探索人工智能世界的指南&#xff0c;每天我们为你呈现AI领域的热点内容&#xff0c;聚焦开发者&#xff0c;助你洞悉技术趋势、了解创新AI产品应用。 新鲜AI产品点击了解:AIbase - 智能匹配最适合您的AI产品和网站 &#x1f4e2;一分钟速…

Netty优化

文章目录 概述优化方法性能篇网络参数优化业务线程池的必要性共享 ChannelHandler设置高低水位线GC 参数优化线程绑定 高可用篇连接空闲检测流量整形堆外内存泄漏排查思路Netty 自带检测工具二分排查法&#xff1a;笨方法解决大问题 概述 netty 是一种异步的、基于事件驱动的网…

Elastic boosting的使用

boosting介绍 Boosting查询允许您降低与负面查询匹配的文档的相关性评分 boosting语法 GET /_search {"query": {"boosting": {"positive": {"term": {"text": "apple"}},"negative": {"term&q…

如何拆解技术瓶颈的难点

以大化小的思路 解决一个一个小问题从而解决最终问题 三段论&#xff1a; 抽象能力 职责领域划分 分层构建解决方案 案例&#xff1a;全局分布式事务的解决方案 抽象能力&#xff1a;全局分布式 是由一个个小的事务组合而成的&#xff0c;其中一个分布式事务出现问题&#xff…

亚马逊Bedrock引领生成式AI创新,Claude 3模型家族开启新时代

近日&#xff0c;亚马逊宣布其云计算平台亚马逊Bedrock已成为构建和扩展基于大型语言模型&#xff08;LLM&#xff09;和其他基础模型&#xff08;FMs&#xff09;的生成式AI应用的最佳平台。Anthropic公司开发的Claude模型家族&#xff0c;作为高性能FMs的代表&#xff0c;正在…

探索考古文字场景,基于YOLOv8全系列【n/s/m/l/x】参数模型开发构建文本考古场景下的甲骨文字符图像检测识别系统

甲骨文是一种非常历史悠久的古老文字&#xff0c;在前面我们基本上很少有涉及这块的内容&#xff0c;最近正好在做文字相关的项目开发研究&#xff0c;就想着基于甲骨文的场景来开发对应的检测识别系统&#xff0c;在前文中我们基于YOLOv5、YOLOv7和YOLOv9开发构建了在仿真数据…

激活函数Mish

paper&#xff1a;Mish: A Self Regularized Non-Monotonic Activation Function official implementation&#xff1a;https://github.com/digantamisra98/Mish 背景 在早期文献中&#xff0c;Sigmoid和TanH激活函数被广泛使用&#xff0c;随后在深度神经网络中失效。相比于…

Redis 创建群时报错 Node XXX is not empty

在创建 Redis 集群时报错[ERR] Node XXX is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0. 主要原因是 RDB 或者 AOF 文件中有数据&#xff0c;redis集群搭建的时候需要所有节点都为 空&#xff0c;不…

【组件初始化链条】简化Unity组件的初始化

简介 在游戏脚本中我们通过借助GetComponent或TryGetComponent方法获取组件&#xff0c;所以当需要获取较多组件时&#xff0c;我们不可避免地要书写一些重复代码&#xff0c;为了提升代码简洁程度&#xff0c;简化组件初始化逻辑&#xff0c;本文以"组件初始化链条"…

Springboot的配置文件及其优先级

配置文件 内置配置文件 配置文件的作用&#xff1a;修改SpringBoot自动配置的默认值&#xff1b;SpringBoot在底层都给我们自动配置好&#xff1b;SpringBoot使用一个全局的配置文件&#xff0c;配置文件名是固定的&#xff1a; application.propertiesapplication.yml 以上…

网络建设与运维培训介绍和能力介绍

1.开过的发票 3.培训获奖的证书 4合同签署 5.实训设备

利用 boost::asio::ssl C/C++ 检查SSL/PEM证书文件的有效性

我们可以通过 boost::asio::ssl::context &#xff08;SSL上下文&#xff09;对象实例成员接口来检查SSL证书文件的有效性。 1、use_certificate_chain_file 使用证书链文件&#xff08;CA*&#xff09; 2、use_certificate_file 使用证书文件&#xff08;公钥&am…

[ThinkPHP]Arr返回1

$detailId (int)Arr::get($detail, null); var_dump($detailId); 打印结果&#xff1a;int(1) 原因&#xff1a; vendor/topthink/think-helper/src/helper/Arr.php

干洗店管理系统洗鞋店预约上门小程序洗护流程;

干洗店洗鞋店收银管理系统&#xfe63;智能线上预约洗衣店小程序软件; 闪站侠洗衣洗鞋店收银管理系统&#xff0c;一款集进销存、收衣、收银、会员管理等实用功能于一体的洗护管理软件&#xff0c;适用于各大中小型企业个体工商户&#xff0c;功能强大&#xff0c;操作简单&…