Java Lambda + 空指针四种主流处理方案

发布时间:2026/6/11 13:01:11

Java Lambda + 空指针四种主流处理方案 Lambda 开发最容易 NPE集合为空、元素为 null、字段为 null常用四种if判空、Optional、Stream过滤、函数式空安全优先用 Optional Stream替代大量 if符合 Lambda 函数式思想。一、方案 1传统 if 判空不推荐在 Lambda 大量使用过渡原理提前 null 判断再执行逻辑最原始。User user null; if(user ! null){ System.out.println(user.getName()); }缺点代码臃肿链式流式代码中割裂 Lambda 风格大量 if 重复造轮子。适用简单单行代码流式处理禁用。二、方案 2OptionalLambda 标配首选JDK8【重点背诵】核心定位容器对象用来封装可能为 null 的值杜绝显式 ifnull函数式处理空配合 Lambda四个核心 API必背 4 个Optional.ofNullable(obj)可以传 null日常 99% 用Optional.of(obj)入参不能 null空直接 NPEorElse(默认值)为空返回默认值orElseGet(Supplier)为空执行 Lambda 生成默认懒加载性能优orElseThrow()空抛异常map(Function)安全获取嵌套属性解决多层对象空指针重中之重ifPresent(Consumer)非空才执行 Lambda 逻辑实战 1普通对象空安全User user null; // 非空执行打印 Optional.ofNullable(user).ifPresent(u- System.out.println(u.getName())); // 空给默认对象 User defUser Optional.ofNullable(user).orElse(new User(默认)); // Lambda懒创建默认推荐 User user2 Optional.ofNullable(user).orElseGet(()-new User());实战 2多层对象最经典解决连环 NPE// user→Address→city多层任意一层null都不报错 String city Optional.ofNullable(user) .map(User::getAddress) .map(Address::getCity) .orElse(未知城市);map 特点中间任意返回 null后续 map 不再执行直接走到 orElse。实战 3空则抛异常User u Optional.ofNullable(user).orElseThrow(()-new RuntimeException(用户不存在));Optional 使用口诀ofNullable 包对象map 逐层拿属性ifPresent 非空执行orElse 兜底默认值。三、方案 3Stream filter 过滤 null集合遍历 Lambda 空处理高频场景List 集合中元素为 null / 对象字段为 nullfilter(Objects::nonNull)过滤空元素再执行后续 map/forEach。ListUser userList Arrays.asList(null,new User(张三),null,new User(李四)); // 过滤null元素再Lambda处理 userList.stream() .filter(Objects::nonNull) // 剔除集合里null元素 .forEach(u- System.out.println(u.getName())); // 字段为空过滤 userList.stream() .filter(Objects::nonNull) .filter(u-u.getName()!null) .map(User::getName) .collect(Collectors.toList());拓展Objects.nonNull()/isNull()JDK8 工具方法Lambda 筛选标配。四、方案 4函数式默认值 三元简单字段兜底搭配 Lambda、Stream map 中兜底// 字段为空返回默认字符串 ListString names userList.stream() .filter(Objects::nonNull) .map(u-u.getName()null ? 无名:u.getName()) .collect(Collectors.toList());五、四种方案选型对比背诵表格方案适用场景优点缺点if 判空简单零散代码易懂破坏流式 Lambda代码冗余Optional单个对象、多层级属性获取链式优雅、函数式、无 if不能直接处理集合Stream filter集合批量处理批量过滤空流式一体化只管集合元素不适合单个对象三元表达式单个字段快速兜底极简多层嵌套可读性差项目统一规范工作落地单个 POJO、多级属性统一用 Optional.map ()List 集合流式处理开头 filter (Objects::nonNull)简单字段赋值三元表达式快速兜底杜绝大量 if (user!null)六、高频综合实战项目标准写法需求用户列表过滤空用户、空姓名获取城市空城市赋值【未知】ListString cityList userList.stream() .filter(Objects::nonNull) // 剔除null用户 .map(user- Optional.ofNullable(user.getAddress()).map(Address::getCity).orElse(未知)) .collect(Collectors.toList());七、易错坑面试常问Optional.of()不能传 null必 NPE一律优先ofNullableorElse不管空不空对象提前创建orElseGet只有空才创建资源重对象优先 orElseGetOptional 是容器不能用 null 判断容器容器永远非空空是内部值为空。八、终极背诵总结单个对象多层空Optional 链式 map集合遍历有空值Stream filter 先剔除简单字段缺默认三元表达式兜底少写 if 少判空Lambda 风格要统一。

相关新闻