Java8新特性之集合removeIf

Java 集合中的 `removeIf` 和 Stream API 的 `filter` 在Java编程中,处理集合数据是一项常见的任务。removeIf和 Stream API 中的filter方法。 阅读详情

在使用阿里的代码规范检测插件后,不得不承认代码的质量提高了很多,在这里也推荐给大家:
https://www.cnblogs.com/Mr-Rocker/p/7676694.html

这里遇到一个问题,在我写迭代器的时候通常是这么写的:

List <Integer> list = new ArrayList <>();
list.addAll(Arrays.asList(1, 2, 3, 4, 5));
final Iterator <Integer> iterator = list.iterator();
while (iterator.hasNext()){
    final Integer i = iterator.next();
    if(2 == i){
     it.remove();
    }
}

但是阿里的插件检测出代码不规范,它的推荐写法是:

list.removeIf(i -> 2 == i);

确实清爽了许多,简洁了许多,最关键的是很有效。

后来看了下源码:

/**
  * Removes all of the elements of this collection that satisfy the given
  * predicate.  Errors or runtime exceptions thrown during iteration or by
  * the predicate are relayed to the caller.
  *
  * @implSpec
  * The default implementation traverses all elements of the collection using
  * its {@link #iterator}.  Each matching element is removed using
  * {@link Iterator#remove()}.  If the collection's iterator does not
  * support removal then an {@code UnsupportedOperationException} will be
  * thrown on the first matching element.
  *
  * @param filter a predicate which returns {@code true} for elements to be
  *        removed
  * @return {@code true} if any elements were removed
  * @throws NullPointerException if the specified filter is null
  * @throws UnsupportedOperationException if elements cannot be removed
  *         from this collection.  Implementations may throw this exception if a
  *         matching element cannot be removed or if, in general, removal is not
  *         supported.
  * @since 1.8
  */
 default boolean removeIf(Predicate<? super E> filter) {
     Objects.requireNonNull(filter);
     boolean removed = false;
     final Iterator<E> each = iterator();
     while (each.hasNext()) {
         if (filter.test(each.next())) {
             each.remove();
             removed = true;
         }
     }
     return removed;
 }

借用某人的翻译:

/**
  * 移除集合中满足给定条件的所有元素,错误或者运行时异常发生在迭代时或者把条件传递给调用者的时候。
  *
  * @implSpec
  * 默认的实现贯穿了使用迭代器iterator的集合的所有元素。每一个匹配的元素都将被用Iterator接口中的
  * remove()方法移除。如果集合的迭代器不支持移除,则在第一次匹配时就会抛出异常 UnsupportedOperationException
  *
  * @param filter 令元素移除成功的条件
  * @return {@code true} 如果所有的元素都被移除
  * @throws NullPointerException 如果有一个过滤器是空的
  * @throws UnsupportedOperationException 如果元素不能被从该集合中移除。如果一个匹配元素不能被移除,
  *         通常来说,它就不支持移除操作,这时可能抛出这个异常。
  * @since 1.8
  */
 default boolean removeIf(Predicate<? super E> filter) {
     Objects.requireNonNull(filter);
     boolean removed = false;
     final Iterator<E> each = iterator();
     while (each.hasNext()) {
         if (filter.test(each.next())) {
             each.remove();
             removed = true;
         }
     }
     return removed;
 }

所以,以后还是用新方法吧,与时俱进哦。

removeIf() 方法,结合 Lambda 表达式 在 Java 8 中,removeIf() 方法是 Collection 接口新增的一个默认方法,用于根据条件批量删除集合中的元素。结合 Lambda 表达式,可以以极简的语法实现复杂的过滤逻辑。以下是详细说明 阅读详情

相关推荐

Java8 新特性之集合: removeIf(Predicate<? super E> filter)

下边是JDK1.8.0_121中接口Collection的部分源码:/** * Removes all of the elements of this collection that satisfy the given * predicate. Errors or runtime exceptions thrown during iteration or by * the predic

HelloMrZheng的博客 1万+

Java 8 数据过滤,removeIf 和 filter 别用错了!!

Java架构进阶面试及知识点文档笔记这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理Java分布式高级面试问题解析文档其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!互联网Java程序员面试必备问题解析及文档学习笔记Java架构进阶视频解析合集《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》

2401_84408404的博客 3636

手把手教你用示波器测试DDR5 DRAM信号完整性(附眼图分析技巧)

本文详细介绍了如何使用示波器测试DDR5 DRAM信号完整性,包括眼图分析技巧。从DDR5的核心挑战、测试设备选型到实测工作流程,提供了全面的指导。特别强调了DFE功能验证和系统级协同测试,帮助工程师解决信号完整性问题,提升测试效率。

g2h3i4j5的博客 1149

Java8的removeIf和filter的区别

Stream filter(Predicate<? super T> predicate) 返回由与此给定谓词匹配的此流的元素组成的流。 removeIf和filter方法都能达到过滤/删除元素的作用。 从功能是实现上,removeIf是条件为true则过滤此元素,false则保留。而filter则是条件为false过滤此元素,而true则保留。 从时间上,要看场景,因为remov...

睶 4241

Lumerical官方案例、FDTD时域有限差分法仿真学习(三)——环形谐振器(Ring resonator)之第一部分

环形谐振器教程的第 1 部分使用 MODE 来设计和仿真环形谐振器。 自由光谱范围 (FSR) 和品质因数 (Q 因数) 是这种面向片上通信应用的基于绝缘体上硅 (SOI) 波导设计的关键性能指标。

weixin_45719141的博客 3万+

【RDMA】13. RDMA之用户态与内核态交互

原文:https://zhuanlan.zhihu.com/p/346708569 在“RDMA之Verbs”一文中我们说道,Verbs API分为用户态和内核态,分别以ibv_和ib_作为前缀。RDMA技术的最大的优势就在于用户态可以绕过内核,直接控制硬件收发数据,减少了系统调用和内存拷贝次数,所以大部分的RDMA应用都是用户态应用,即使用以ibv_为前缀的用户态Verbs API。 但是并非所有的用户态Verbs API都可以完全绕开内核,本文中我来讲解一下哪些API依赖于内核RDMA子系统(包括驱

我的笔记本 4285

java动态添加元素_java 动态增/减集合元素

1. 简介有时候需要在集合遍历过程中进行增/删,下面介绍几种正确的操作方式。2. 示例例如有如下集合[1, 2, 2, 3, 5],需要删除被2整除的元素。1 import java.util.*;23 public classListFunc2 {45 public static voidmain(String[] args){6 String str = "12235"...

weixin_29904391的博客 560

Verilog除法器(32位无符号+带符号)

32位无符号除法器设计 恢复余数法: 恢复余数除法的基本思路是从“部分余数”中减去除数,如果结果为负(不够减),则恢复原来的部分余数,商0. 寄存器使用: reg_r 存放被除数a reg_b 存放除数b reg_r 存放余数(初始清零) 具体做法: 做减法时,减数是reg_b中的除数,被减数是reg_r中的余数左移一位,最低位由reg_q(被除数)的最高位补充。为了能够判断相减结果的正...

qq_38600065的博客 1万+

集合删除元素技巧 removeIf

removeIf

小泽 807

VS2015编译配置GDAL(图文并茂、超详细!!!)

文章目录一、GDAL介绍二、下载GDAL三、修改源代码四、工具命令提示符操作五、编译GDAL六、安装GDAL七、在VS2015的项目中配置GDAL八、添加环境变量九、测试是否配置成功 一、GDAL介绍 GDAL(Geospatial Data Abstraction Library)是一个在XMIT许可协议下的开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。OGR是GDAL项目的一个分支,功能与GDAL类似,只不过它提供对矢量数据的支持。因此

weixin_46196863的博客 3756

深度强化学习在足式机器人中的应用 (一):基础原理与仿真环境

我们将首先深入探讨其背后的核心挑战与技术栈,然后详细推导机器人学和强化学习的基本数学原理,特别是剖析在机器人控制领域表现卓越的PPO算法。下面的独立Python脚本展示了Isaac Gym的基本API用法,加载一个Go1机器人(假设URDF已准备好),并让它执行一个简单的预设动作(正弦波运动),以此来熟悉仿真流程。:代码的核心是直接操作GPU上的PyTorch张量,避免了CPU和GPU之间的数据拷贝,这是实现高性能的关键。:所有计算(如伪策略中的正弦波计算)都应该是向量化的,一次性为所有。

VectorShift的博客 228

java 8 集合_Java8的这些集合骚操作,你掌握了嘛?

函数的函数式编程,大大简化了之前冗杂的写法。如果你对Lambda还不了解,可以参考我之前的关于Lambda表达式的总结:Java8的Lambda表达式,你会不?对于集合一类,我们来整理一下发生的变化叭。Iterable的forEachIterable接口就是所有可迭代类型的父接口,我们熟知的Collection接口就是继承自它。Java8接口默认方法以及Lambda表达式的出现,让我们在遍历元素时...

weixin_39856269的博客 313

YOLOv8 改进:使用 MobileNetV3 轻量化架构改进特征提取网络

通过使用 MobileNetV3 作为 YOLOv8 的特征提取器,能够显著降低模型复杂度和运行时资源消耗,同时在一定程度上保持检测精度。这种方法特别适合需要高效计算的边缘设备和嵌入式系统。

走向CTO的路上... 1275

Java8的这些集合骚操作,你掌握了嘛?

如果传给该方法的key参数Map中对应的value不为null,该方法将使用remappingFunction根据原key、value计算一个新的结果。如果传给该方法的key参数在Map中对应的value为null,则使用mappingFunction根据key计算个新的结果。//key==6 对应的value为null (或不存在)时,使用计算的结果作为新value。// key存在或 value存在,则返回对应的value,否则返回defaultValue。

2401_85958326的博客 384

【DRAM存储器六十八】DDR5介绍--DQS Interval Oscillator—动态时序校准利器

DDR5内存采用DQS间隔振荡器(DQSIntervalOscillator)技术应对高速数据传输中的时序漂移问题。该技术通过测量DQS信号在可编程时间窗口内的振荡次数(16位计数值),动态监测温度/电压变化导致的DQS-DQ延迟偏移。控制器通过MPC命令启停振荡器,读取MR46/MR47寄存器获取计数值,并与基准值对比来调整DQS相位,确保数据采样窗口始终处于最佳位置。该机制使DDR5在8400MT/s高速率下仍能保持数据可靠性,有效补偿±0.48tCK的时序偏移。

highman110的博客 149

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Android Studio 2.1 稳定版开始支持 java8

不得不说这是一个激动人心的消息!以后终于可以在Android Studio里面使用 飘逸的 lambda 表达式了!以及 java8之后集合类扩展的一些新功能(比如 foreach(), removeIf()….),好吧,这句目前还只是想想。 wait, 如果只是单单的支持了lambda,好像之前用 retrolambda 插件也可以啊。 但是,虽说主要功能是一样的,都是对于 lambda 的支

Code-S 2226

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java8 list print_Java8的这些集合骚操作,你掌握了嘛?

Java8时Lambda表达式的出现,将行为作为参数传递进函数的函数式编程,大大简化了之前冗杂的写法。对于集合一类,我们来整理一下发生的变化吧。Iterable的forEachIterable接口就是所有可迭代类型的父接口,我们熟知的Collection接口就是继承自它。Java8接口默认方法以及Lambda表达式的出现,让我们在遍历元素时对元素进行操作变得格外简单。下面的forEach方法就是J...

weixin_35792040的博客 687

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

回味集合(二) Collection

接着上次的继续,在集合框架的大家族中我们说完了集合的祖宗Iterator,接下来我们看看他的“孩子”—Collection。 publicinterfaceCollection<E>extendsIterable<E> 可以看出来Collection也是一个接口,他继承的Iterator接口在Iterator的基础上又扩展的一些功能: 1.intsize(); 2.booleanisEmpty(); 3.booleancontains(Objecto)

程序缘 231

java8 list根据对象属性去重_Java8的这些集合骚操作,你掌握了嘛?

Java8时Lambda表达式的出现,将行为作为参数传递进函数的函数式编程,大大简化了之前冗杂的写法。对于集合一类,我们来整理一下发生的变化叭。Iterable的forEachIterable接口就是所有可迭代类型的父接口,我们熟知的Collection接口就是继承自它。Java8接口默认方法以及Lambda表达式的出现,让我们在遍历元素时对元素进行操作变得格外简单。下面的forEach方法就是J...

weixin_39781452的博客 120

bootstrap 集合移除key_Java8的这些集合骚操作,你掌握了嘛?

Java8时Lambda表达式的出现,将行为作为参数传递进函数的函数式编程,大大简化了之前冗杂的写法。对于集合一类,我们来整理一下发生的变化吧。Iterable的forEachIterable接口就是所有可迭代类型的父接口,我们熟知的Collection接口就是继承自它。Java8接口默认方法以及Lambda表达式的出现,让我们在遍历元素时对元素进行操作变得格外简单。下面的forEach方法就是J...

weixin_35935279的博客 218

java list 迭代 删除_Java迭代时从集合中删除元素

小编典典让我举几个例子,并提出一些避免方案ConcurrentModificationException。假设我们有以下藏书List books = new ArrayList();books.add(new Book(new ISBN("0-201-63361-2")));books.add(new Book(new ISBN("0-201-63361-3")));books.add(new B...

weixin_39756445的博客 352

自我总结的一些java编码习惯(不断更新)

本文记录一下我最近一段时间遇到过的一些代码优化或者代码规范写法,想起来就不断更新和记录。 因一些代码是公司代码,为了合理放出来,有一些命名或者格式是自我更改,减少公司代码出现在互联网,可能出现一些命令规范不太好的,比如没有按驼峰命名方式等一些基础错误,有时间逐一更改。 1.使用java8后,优化一些代码写法 例1:关于list里删除元素,根据阿里规范手册要求,基本使用迭代来处理 ...

小个子奥特曼的博客 743

Java8的这些集合骚操作,你掌握了嘛?,springtoolsuite教程

list.forEach(System.out::println); } Iterator的forEachRemaining ============================= java.util.Iterator是用于 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》 【docs.qq.com/doc/DSmxTbFJ1cmN1R2dB】 完整内容开源分享 遍历集合的迭代器,接口定义如下: public interface Iterator { boolea

m0_64867092的博客 150

Lambda表达式和Java集合框架

Lambda表达式和Java集合框架 本文github地址 Java8为容器新增一些有用的方法,这些方法有些是为完善原有功能,有些是为引入函数式编程(Lambda表达式),学习和使用这些方法有助于我们写出更加简洁有效的代码.本文分别以ArrayList和HashMap为例,讲解Java8集合框架(Java Collections Framework)中新加入方法的使用. 前言 我...

Tracyclock的博客 357
上一篇: Java8之lambda表达式
下一篇: git commit 时 emoji 的使用
程序员青戈
程序员青戈 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄10年 3万+粉丝 250原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员青戈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值