removeif()方法通过lambda表达式提供predicate谓词,遍历集合并删除所有匹配条件的元素,简洁高效。

Java 中 removeIf() 方法配合 Lambda 表达式,是动态删除集合元素最简洁高效的方式。核心在于:Lambda 提供一个 返回 boolean 的谓词(Predicate),集合遍历每个元素,对满足条件的元素执行删除。
理解 removeIf 的执行逻辑
removeIf(Predicate super E> filter) 是 Collection 接口定义的方法,所有实现类(如 ArrayList、LinkedList、HashSet)都支持。它不是“边遍历边删导致 ConcurrentModificationException”,而是内部使用迭代器安全删除 —— 你无需手动处理迭代器或索引。
- 传入的 Lambda 必须是
boolean test(T t)形式,返回true表示该元素要被删除 - 删除动作在方法内部完成,调用后原集合直接改变
- 返回
true表示至少删了一个元素,false表示没删任何元素
常见删除场景与 Lambda 写法
根据实际判断条件灵活编写 Lambda,注意变量作用域和不可变性限制:
- 按属性值删除:比如删除姓名为 "张三" 的用户
list.removeIf(user -> "张三".equals(user.getName()));
- 按数值范围删除:比如删除年龄小于 18 或大于 60 的记录
list.removeIf(person -> person.getAge() 60);
- 按集合成员关系删除:比如删除黑名单中的 ID
Set<long> blackIds = Set.of(101L, 205L, 307L); list.removeIf(item -> blackIds.contains(item.getId()));</long>
- 按字符串匹配删除:比如删除邮箱不以 "@example.com" 结尾的用户
list.removeIf(user -> !user.getEmail().endsWith("@example.com"));
注意事项和避坑点
看似简单,但几个细节容易出错:
-
不能在 Lambda 中修改集合本身:比如在 Lambda 里调用
list.add()或list.remove(),会抛ConcurrentModificationException -
基本类型包装需防空指针:若字段可能为
null(如user.getAge()),应先判空再比较,或用Objects.equals()、Optional等方式处理 -
并发环境下慎用:
removeIf不是线程安全操作,多线程同时调用需加锁或改用CopyOnWriteArrayList -
Map 的 keySet/valueSet 也可用:比如
map.keySet().removeIf(key -> key.startsWith("temp_"))
替代方案对比(为什么推荐 removeIf + Lambda)
相比传统 for 循环或迭代器手动删除,这种方式更安全、简洁、可读性强:
- 传统 for-i 循环倒序删:易错、冗长、不直观
- 增强 for 循环中调
remove():直接抛异常 - 显式 Iterator +
remove():代码多、模板化、易漏调iterator.remove() -
removeIf+ Lambda:一行解决,语义清晰,JVM 优化好,无并发风险(单线程下)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











