Java中Stream的filter方法用于根据Predicate条件筛选元素,返回新流且不修改原数据,支持链式调用、惰性执行,需注意空值处理与纯函数约束。

Java 中 Stream 的 filter 方法用于根据指定条件保留符合条件的元素,它接收一个 Predicate(断言)函数式接口作为参数,返回一个新的 Stream。
filter 的基本用法
filter 不会修改原集合或数组,而是生成一个新流,只包含满足条件的元素。使用前需确保数据已转为 Stream(如通过 Collection.stream() 或 Arrays.stream())。
- 语法简洁:直接传入 lambda 表达式,例如
stream.filter(x -> x > 10) - 支持链式调用:可与其他中间操作(如 map、sorted)或终止操作(如 collect、forEach)组合使用
- 惰性执行:filter 本身不触发计算,只有遇到终止操作时才真正处理数据
常见过滤场景示例
实际开发中常用于数值范围判断、字符串匹配、对象属性筛选等。
- 筛选偶数:
list.stream().filter(n -> n % 2 == 0).collect(Collectors.toList()) - 筛选非空字符串:
strings.stream().filter(s -> s != null && !s.trim().isEmpty()) - 筛选用户年龄大于 18:
users.stream().filter(u -> u.getAge() > 18)
注意空值和异常处理
filter 内部不会自动处理 null,若源数据含 null,需在条件中显式判断,否则可能抛出 NullPointerException。
立即学习“Java免费学习笔记(深入)”;
- 安全写法:先判空再操作,如
filter(Objects::nonNull)或filter(s -> s != null && s.length() > 5) - 避免在 filter 中做耗时或有副作用的操作(如 I/O、修改外部变量),它应是纯函数
- 多个条件可用逻辑运算符连接,也可拆成多个 filter 提高可读性(但性能略低)
与其它操作配合使用
filter 常作为流水线起点或中间环节,结合 map 转换、limit 截取、distinct 去重等效果更佳。
- 先过滤再转换:
list.stream().filter(x -> x > 0).map(String::valueOf).collect(Collectors.toList()) - 限制结果数量:
stream.filter(...).limit(5) - 去重后过滤:
stream.distinct().filter(...)(注意 distinct 依赖 equals/hashCode)


















