java中lambda表达式通过stream().filter()简化列表过滤,替代传统for循环+if判断,代码更短、意图更清晰;支持方法引用、链式操作,需注意空值安全和collect调用。

Java 中 Lambda 表达式简化列表过滤,核心是用 stream().filter() 替代传统 for 循环 + if 判断,代码更短、意图更清晰。
用 filter() + Lambda 替代手动遍历
传统方式要新建集合、循环、判断、添加;Lambda 方式一行搞定:
- 原写法:List
result = new ArrayList();
for (String s : list) {
if (s.length() > 3) result.add(s);
} - Lambda 写法:
list.stream().filter(s -> s.length() > 3).collect(Collectors.toList())
结合方法引用让代码更简洁
当判断逻辑可复用或已有静态/实例方法时,优先用方法引用:
- 比如过滤非空字符串:
list.stream().filter(Objects::nonNull).collect(...) - 自定义方法:
list.stream().filter(this::isValidUser).collect(...)(isValidUser(User u)是当前类中的 boolean 方法)
链式操作一次完成过滤+转换+收集
filter 可和其他 stream 操作组合,避免中间变量:
- 只取满足条件的用户名长度:
list.stream().filter(s -> s.startsWith("A")).map(String::length).collect(Collectors.toList()) - 过滤后去重再转数组:
list.stream().filter(s -> s.contains("test")).distinct().toArray(String[]::new)
注意返回类型和空值安全
filter 不改变原列表,返回新 Stream;collect 才真正生成结果。常见陷阱:
- 忘记调用
collect()→ 返回的是 Stream,不是 List - 原始列表含 null 时,
s -> s.length() > 3会 NPE,应先用Objects::nonNull或写成s -> s != null && s.length() > 3 - 大数据量时,如只需一个结果,用
findFirst()或findAny()比 collect 更高效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











