stream api不支持直接删除元素,剔除本质是过滤重建;安全方式仅有三种:filter+collect生成新列表、removeif修改原集合、partitioningby分割数据。

Stream API 本身不提供“删除”元素的能力,因为它设计上是不可变的——流操作不会修改原始数据源,只生成新结果。所谓“剔除”,本质是过滤后重建,关键在于选对方式、避开陷阱。
用 filter + collect 生成新列表
这是最常用也最安全的做法,适合需要保留原集合或做链式处理的场景。
- 调用 stream().filter(),传入取反的条件(即保留哪些)
- 用 collect(Collectors.toList()) 把结果转回 List
- 记得把新列表重新赋值给变量,否则原引用仍指向旧数据
例如:从字符串列表中剔除空串和 null
List.filter(Objects::nonNull)
.filter(s -> !s.trim().isEmpty())
.collect(Collectors.toList());
用 removeIf 直接修改原列表
如果明确要改原集合,removeIf() 是 JDK 8 为 Collection 接口添加的原生方法,比 Stream 更高效、更直接。
- 它内部已处理并发修改问题,无需额外同步
- 语义清晰:“删掉所有满足条件的”
- 不产生中间对象,内存开销小
例如:剔除所有负数
用 partitioningBy 一并拿到保留项和剔除项
当既要留下符合条件的元素,又想拿到被剔除的那些时,用 Collectors.partitioningBy() 最省事。
- 返回一个 Map
> - false 键对应剔除的部分,true 键对应保留的部分
- 仍是无副作用操作,原列表不变
例如:分离偶数和奇数
Map.collect(Collectors.partitioningBy(n -> n % 2 == 0));
List
List
务必避开的坑
别在遍历过程中调用普通 list.remove(),会触发 ConcurrentModificationException。
- 增强 for 循环里删元素 → 不安全
- Stream 的 forEach 中调用 remove() → 不安全,且违背函数式原则
- filter 里写副作用逻辑(如打印+删)→ 语义混乱,结果不可控
真正安全的剔除,只有三种正解:filter+collect、removeIf、partitioningBy —— 选哪个,取决于你是否要改原集合、是否需要被剔除的数据。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











