java stream的filter核心是三步:转流→设条件→收集结果;它不修改原集合,而是生成只含符合条件元素的新流,需配合collect、count等终端操作才执行,且多个filter等价于and逻辑。

Java 中用 Stream API 的 filter 过滤数据,核心是三步:转流 → 设条件 → 收集结果。它不修改原集合,而是生成一个只含符合条件元素的新流。
基本写法和执行流程
filter 是中间操作,必须配合终端操作(如 collect、count、forEach)才会真正执行:
- 调用
collection.stream()把集合变成流 - 链式调用
.filter(predicate),传入一个返回 boolean 的 lambda 或方法引用 - 最后用
.collect(Collectors.toList())等收集成新集合,或用.count()统计数量
常见过滤条件怎么写
Predicate 的写法要准确返回 true/false,不能有副作用(比如打印、修改变量):
- 数值筛选:比如保留大于 10 的整数 →
n -> n > 10 - 字符串非空:先防 null,再判内容 →
s -> s != null && !s.trim().isEmpty() - 对象属性组合:用户年龄>18 且状态为激活 →
u -> u.getAge() > 18 && u.isActive() - 集合类判断:订单至少含 3 个商品 →
o -> o.getItems() != null && o.getItems().size() >= 3
多个 filter 怎么理解
连续写多个 filter,逻辑上是“且”关系(AND),等价于把条件用 && 合并在一个 filter 里:
-
.filter(x -> x > 0).filter(x -> x % 2 == 0)⇔.filter(x -> x > 0 && x % 2 == 0) - 分拆写可读性更好;合并写在大数据量下略高效(避免重复遍历)
- 注意:filter 不会短路——即使第一个元素就满足,它仍会检查所有元素
容易出错的点
看似简单,但几个细节常导致结果异常或性能问题:
- 忘记处理 null:对对象字段调用方法前没判空,运行时抛 NullPointerException
- 在 lambda 里做日志或修改外部变量:filter 是惰性求值,行为不可控,也违背函数式原则
- 误以为 filter 修改原集合:原始 List/Set 完全不变,必须靠 collect 才拿到新结果
- 对小集合滥用 stream:比如只有 5 个元素,传统 for 循环更直接、开销更低
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











