Java中filter方法通过Predicate接口对流元素进行条件过滤,只保留返回true的元素;它是惰性求值的中间操作,需配合终止操作触发,支持Lambda、方法引用和复用Predicate,使用时需注意null安全、避免副作用,并优先filter再map以提升性能。

Java 中使用 filter 方法过滤流中的元素,核心是传入一个 Predicate 函数式接口实现,它对每个元素返回 true 或 false,只保留返回 true 的元素。
filter 基本用法
filter 是 Stream 的中间操作,不会立即执行,需配合终止操作(如 collect、forEach、count)才触发处理。常用写法如下:
- 直接写 Lambda 表达式:
stream.filter(x -> x > 10) - 引用方法或静态方法:
stream.filter(String::isBlank)或stream.filter(MyUtils::isValid) - 复用已定义的 Predicate 变量:
Predicateeven = n -> n % 2 == 0; stream.filter(even)
常见过滤场景示例
假设有一个整数列表和字符串列表,可这样过滤:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- 筛选偶数:
list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList()) - 排除空或空白字符串:
strings.stream().filter(s -> s != null && !s.trim().isEmpty()) - 按对象属性筛选:
users.stream().filter(u -> u.getAge() >= 18 && u.isActive()).toList()
注意 null 安全和短路逻辑
filter 不会自动处理 null 元素,若流中可能含 null,需显式判断避免 NullPointerException:
- 安全过滤非空字符串:
stream.filter(Objects::nonNull).filter(s -> !s.isEmpty()) - 多个 filter 可链式调用,等价于逻辑与(AND),且支持短路:前一个 filter 排除的元素不会进入后续 filter
- 不推荐在 filter 中做耗时或副作用操作(如打印、修改外部状态),违背函数式原则,也影响并行流行为
与其它中间操作配合
filter 常与 map、distinct、sorted 等组合使用,顺序会影响结果和性能:
- 先
filter再map更高效(减少映射次数) - 去重前过滤更合理:
stream.filter(...).distinct(),而非stream.distinct().filter(...) - 排序通常放最后(除非需按条件排序后取前 N 个)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










