java stream的filter方法用于条件筛选并返回新流,需配合collect等终止操作才执行;须处理null避免npe;支持链式过滤、predicate组合及按对象属性筛选。

Java Stream 的 filter 方法用于按条件筛选元素,它不修改原始集合,而是返回一个只含符合条件元素的新流。关键点是:必须配合终止操作(如 collect、forEach)才会真正执行;条件必须明确返回 boolean;null 值需主动处理,否则容易抛异常。
基础写法与常见误区
最常用形式是传入 Lambda 表达式,例如:
list.stream().filter(x -> x > 10).collect(Collectors.toList())- 注意:只调用
filter()不会生效,必须接collect()或其他终端操作 - 原集合(如
List)完全不变,结果是全新集合 - 若源数据含
null,且条件里直接调用方法(如s.length()),会触发NullPointerException
安全处理 null 和空值
避免运行时异常,推荐两种方式:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 前置过滤:
stream.filter(Objects::nonNull),再链式加其他条件 - 防御性判断:
filter(s -> s != null && !s.trim().isEmpty()) - 对对象字段判空再访问:
filter(u -> u.getProfile() != null && u.getProfile().getAge() >= 18)
按对象属性或复杂逻辑过滤
对自定义对象集合,直接通过点号访问字段,多个条件建议加括号明确优先级:
- 状态为 ACTIVE 且金额超 100:
filter(o -> "ACTIVE".equals(o.getStatus()) && o.getAmount() > 100) - 复用已有方法:
filter(Product::isInStock)(前提是该方法返回boolean) - 忽略大小写匹配:
filter(n -> n.toLowerCase().startsWith("a"))
多条件组合的实用技巧
多个条件不必硬塞进一个 Lambda,灵活拆分或组合更清晰:
- “与”关系:链式调用两个
filter,可读性高:.filter(isValid()).filter(hasPermission()) - 也可用
Predicate.and()组合:((Predicate<string>) s -> s.startsWith("a")).and(s -> s.length() > 5)</string> - “或”关系用
or(),排除用negate()或Predicate.not() - 注意性能:把
filter尽量放在map、sorted前面,减少后续操作的数据量
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










