filter筛选符合条件元素,map一对一转换元素;应先filter后map以提升安全与效率,避免npe和无效计算,勿混淆map与flatmap。

filter 用来筛选,map 用来转换——两者分工明确,用对顺序和场景,代码才干净又高效。
filter:只留符合条件的元素
它不是“删掉”数据,而是从原流中挑出满足条件的项,生成新流。谓词(Predicate)返回 true 的元素留下,false 的跳过。
- 常见写法:
.filter(x -> x % 2 == 0)留下偶数;.filter(Objects::nonNull)剔除 null - 注意别写反逻辑,比如想留正数却写了
x > 0却没处理负数或零 - 如果流里有 null,又没防护,
.filter(x -> x.isActive())会直接抛 NullPointerException - 建议把 filter 尽量往前放,尤其当后续 map 操作较重(如解析 JSON、调用远程接口),能省不少开销
map:每个元素变一个新元素
一对一映射,不增不减元素个数。输入一个,输出一个;哪怕你返回 null,那个 null 也会进结果流。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 典型用途:提取字段(
.map(User::getName))、格式转换(.map(String::toUpperCase))、数值计算(.map(x -> x * 2)) - 别把它当 flatMap 用:比如想把
List<string></string>拆成所有字符,写.map(s -> s.chars().boxed().collect(...))会得到List<list>></list>,结构嵌套了 - 转换函数里别写副作用,比如改外部变量、写日志、发 HTTP 请求——流可能并行执行,行为不可控
- 遇到可能失败的转换(如字符串转日期),建议在 map 里返回 null 或 Optional,再接 filter 处理,而不是硬吞异常
filter 和 map 组合:先筛后转更稳妥
多数情况下,先 filter 再 map 是更安全、更高效的组合方式。
- 避免无效数据进入昂贵转换:比如只处理非空订单,就先
.filter(Objects::nonNull),再.map(Order::getTotal) - 防止 NPE:对象字段可能为 null,与其在 map 里反复判空,不如提前 filter 掉脏数据,或用
.filter(o -> o != null && o.getTags() != null) - 链式清晰:语义上,“先挑人,再取名”比“取名时顺便判断有没有这个人”更易读、易维护
小提醒:别混淆 map 和 flatMap
map 返回单个值,flatMap 返回一个 Stream;如果你需要把一个元素展开成多个(比如一句话拆成几个词、一个用户对应多个地址),那该用 flatMap,不是 map。
- 错例:
words.stream().map(w -> Arrays.stream(w.split(" ")))→ 得到Stream<stream>></stream> - 对例:
words.stream().flatMap(w -> Arrays.stream(w.split(" ")))→ 得到Stream<string></string>,扁平化完成
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










