arraylist可直接调用stream()获取stream并filter过滤,无需额外转换;操作惰性求值、不修改原集合,需collect才能生成新列表或赋值更新。

Java 中 ArrayList 可以直接通过 stream() 方法转为 Stream,再用 filter() 等操作实现流式过滤,无需额外转换。
获取 Stream 并调用 filter
ArrayList 实现了 Collection 接口,自带 stream() 方法。过滤时传入一个 Predicate(如 Lambda 表达式),返回满足条件的元素新流:
- List
list = Arrays.asList("apple", "banana", "cherry"); - list.stream().filter(s -> s.startsWith("a")).forEach(System.out::println); // 输出 apple
常见过滤场景写法
实际开发中常结合其他操作链式调用:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 过滤 + 收集为新列表:
list.stream().filter(x -> x > 10).collect(Collectors.toList()) - 过滤 + 映射 + 去重:
list.stream().filter(Objects::nonNull).map(String::trim).distinct().toList()(Java 16+) - 过滤空值或无效对象:
filter(Objects::nonNull)或filter(s -> !s.isEmpty())
注意原始集合不变
Stream 操作是**惰性求值、不可变**的,原 ArrayList 不会被修改。所有中间操作(如 filter、map)只构建处理管道,只有终端操作(如 forEach、collect、count)才会真正执行。
- 若需更新原列表,得显式赋值:
list = list.stream().filter(...).collect(Collectors.toList()); - 若只是临时查数据,不建议覆盖原集合,避免副作用
性能与注意事项
对小列表直接 stream 过滤足够高效;大数据量时注意:
- 避免在 filter 中做耗时操作(如数据库查询、IO)
- 必要时用
parallelStream(),但需确保操作线程安全且无状态 - 如果只是简单查找,传统 for 循环或
removeIf()可能更直观(但语义不同)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










