最常用且安全的集合筛选方式是stream().filter(),它支持链式调用和延迟执行,但需确保集合非null并显式collect;removeIf()会修改原集合,适用于就地删除;Guava过滤已过时,应优先使用Stream API。
用 stream().filter() 是最常用也最安全的方式
Java 8 引入的 Stream API 让集合筛选变得直观,且天然支持链式调用和延迟执行。只要集合不是 null,stream() 方法在 Collection 接口里已默认提供,无需额外依赖。
常见错误是直接对 null 集合调用 stream(),会抛出 NullPointerException;另一个坑是误以为 filter() 会修改原集合——它不会,返回的是新 Stream,需显式收集(如用 collect(Collectors.toList()))。
- 筛选字符串长度大于 3 的元素:
list.stream().filter(s -> s != null && s.length() > 3).collect(Collectors.toList());
- 注意判空:lambda 中最好先检查
s != null,尤其当原始集合可能含null值时 - 性能提示:如果只是找“第一个匹配项”,用
findFirst()比collect()更高效
修改原集合要用 removeIf(),但有副作用风险
removeIf() 是 Collection 接口的默认方法,直接遍历并移除满足条件的元素,会改变原集合。它比手动写 for 循环 + Iterator.remove() 更简洁,但要注意并发修改异常和逻辑耦合问题。
典型误用:在增强 for 循环中调用 removeIf() —— 虽然语法合法,但容易引发理解混乱;更严重的是,在多线程环境下直接调用 removeIf() 到非线程安全集合(如 ArrayList),会导致 ConcurrentModificationException 或数据不一致。
立即学习“Java免费学习笔记(深入)”;