java stream api 的 filter 方法基于 predicate 进行条件筛选,返回 true 的元素保留,不改变原集合且延迟执行;支持单条件、and/or/negate 多条件组合及链式调用,兼顾可读性、复用性与性能。

Java Stream API 中的 filter 方法靠 Predicate 实现条件筛选,本质是“对每个元素做一次布尔判断”,返回 true 的留下,false 的丢弃。它不改变原集合,也不立即执行——只有遇到 collect、forEach 这类终端操作时才真正运行。
单条件过滤:最常用也最直接
用 Lambda 写一个返回 boolean 的表达式,就是最基础的 Predicate。
- 筛选偶数:
stream.filter(n -> n % 2 == 0) - 排除空字符串:
stream.filter(s -> !s.isEmpty()) - 找年龄超 18 的用户:
stream.filter(u -> u.getAge() > 18)
这种写法简洁明了,适合逻辑简单、只用一次的场景。
多条件“与”关系:and() 组合更清晰
多个条件必须同时满足时,别堆在同一个 Lambda 里写 &&,推荐用 Predicate.and() 拆开定义。
- 先分别定义:
Predicate<string> longName = s -> s.length() > 5;</string>,Predicate<string> startsWithB = s -> s.startsWith("b");</string> - 再组合:
stream.filter(longName.and(startsWithB))
好处是条件可复用、易测试、命名即语义,比 s -> s.length() > 5 && s.startsWith("b") 更利于后期维护。
多条件“或”和“非”:or() 与 negate() 直接可用
需要满足任一条件,用 or();想取反,用 negate(),都不用自己手写逻辑。
- 姓张或结尾是“王”:
zhang.or(wang) - 不是姓张但结尾是“王”:
zhang.negate().and(wang) - 排除 null 或空字符串:
Objects::nonNull和s -> !s.trim().isEmpty()组合使用
注意 negate() 作用在单个 Predicate 上,不是整个表达式,括号位置影响逻辑结果。
链式 filter vs 组合 Predicate:按场景选
连续调用多个 filter(如 .filter(...).filter(...))和用 and() 合并成一个 filter,效果等价,都是“与”关系。
- 链式适合调试:可逐层观察中间结果,也便于临时开关某条过滤规则
- 组合 Predicate 更高效:减少流遍历次数(尤其数据量大时),语义也更紧凑
- 混合使用没问题:比如先链式筛大范围,再用组合做精细过滤
没有绝对优劣,关键看可读性、复用需求和性能敏感度。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











