当前位置: 首页 > news >正文

面试实战 问题二十七 java 使用1.8新特性,判断空

使用 JDK 1.8 新特性判断对象是否为空

在 Java 1.8 中,Optional 类是最优雅的判空解决方案,它通过函数式编程方式避免 NullPointerException。以下是具体实现方法:

1. 基础判空(对象整体为空)
// 传统方式
if (user != null) {// 业务逻辑
}// JDK 1.8 Optional方式
Optional<User> userOpt = Optional.ofNullable(user);
if (userOpt.isPresent()) {  // 等价于 user != null// 业务逻辑
}
2. 链式安全访问(避免嵌套 null)
// 传统方式(多层判空易出错)
String city = null;
if (user != null && user.getAddress() != null) {city = user.getAddress().getCity();
}// JDK 1.8 Optional链式调用
String city = Optional.ofNullable(user).map(User::getAddress)   // 安全获取Address对象.map(Address::getCity)   // 安全获取City属性.orElse("默认城市");      // 为空时返回默认值
3. 空值处理(提供默认值/异常)
// 场景1:为空时返回默认值
String name = Optional.ofNullable(user).map(User::getName).orElse("匿名用户");  // 为空返回"匿名用户"// 场景2:为空时抛出定制异常
User safeUser = Optional.ofNullable(user).orElseThrow(() -> new UserNotFoundException("用户不存在"));
4. 条件触发(非空时执行操作)
Optional.ofNullable(user).ifPresent(u -> {System.out.println("用户名: " + u.getName());u.activate();  // 非空时执行方法});
5. 集合判空(Stream API 结合)
List<String> list = null;// 安全操作空集合
Optional.ofNullable(list).orElseGet(Collections::emptyList)  // 空时返回空集合.stream().filter(s -> s.length() > 3).forEach(System.out::println);

最佳实践原则

  1. 避免 Optional.get()
    直接调用 get() 会抛出 NoSuchElementException,应优先使用 orElse()/orElseGet()

  2. 不要用 Optional 包装集合
    空集合应用 Collections.emptyList() 表示,而非 Optional<List>

  3. 方法返回值优先返回 Optional

    public Optional<Address> findAddress(User user) {return Optional.ofNullable(user).map(User::getAddress);
    }
    

与传统判空对比

传统方式Optional 方式优势
if (obj != null)Optional.isPresent()链式调用避免嵌套 if
多层属性访问需嵌套判空.map() 自动处理中间 null代码简洁性提升 50%+
需显式处理空值.orElse() 声明式处理减少空指针异常风险

设计哲学:Optional 不是用来替代所有 null 检查,而是通过类型系统显式标记可能为空的值,强制调用方处理空值情况。


相关问题

  1. Optional 的 map()flatMap() 方法有什么区别?
  2. 为什么说滥用 Optional 可能导致性能问题?
  3. 如何在 Spring Boot 的 Service 层统一处理 Optional 返回值?
  4. Java 8 的 Stream API 如何与 Optional 结合处理集合空值?
  5. Optional 与 Kotlin 的可空类型(?)有何异同?
http://www.lryc.cn/news/620138.html

相关文章:

  • 机器学习-----DBSCAN算法
  • 电子电气架构 --- 软件项目文档管理
  • mysql的快照读与当前读的区别
  • 云电竞游戏盒子相比传统PC有什么优势?
  • YOLO-v2-tiny 20种物体检测模型
  • Unity中启用DLSS 【NVIDIA】
  • 循序渐进学 Spring (上):从 IoC/DI 核心原理到 XML 配置实战
  • AWS Bedrock Claude模型费用深度分析:企业AI成本优化指南
  • HarmonyOS Navigation路由跳转的完整示例
  • 天猫商品评论API:获取商品热门评价与最新评价
  • 销售数据预处理与分析学习总结
  • 基于UniApp的智能在线客服系统前端设计与实现
  • Github desktop介绍(GitHub官方推出的一款图形化桌面工具,旨在简化Git和GitHub的使用流程)
  • 公司项目用户密码加密方案推荐(兼顾安全、可靠与通用性)
  • Python day43
  • 【易错题】C语言
  • NTUSER.DAT是什么文件
  • Vue内置组件全解析:从入门到面试通关
  • docker安装centos
  • 接口添加了 @Transactional 注解并开启事务,而其中一个小方法启动了新线程并手动提交数据,会有什么影响?
  • 服务器安全笔记
  • 学习:JS进阶[10]内置构造函数
  • [ 数据结构 ] 泛型 (上)
  • Excel多级数据结构导入导出工具
  • Laravel 使用ssh链接远程数据库
  • Linux Framebuffer(帧缓冲)与基本 UI 绘制技术
  • 【R语言】RStudio 中的 Source on Save、Run、Source 辨析
  • 认知系统的架构: 认知残余三角形、认知主体意识 和认知演进金字塔
  • 【docker①】在VS Code中使用Docker容器
  • 从零用 NumPy 实现单层 Transformer 解码器(Decoder-Only)