当前位置: 首页 > 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.dtcms.com/a/329184.html

相关文章:

  • 深入理解 uni-app 的 uni.createSelectorQuery()
  • SAP Valuation Category在制造业成本核算中的使用场景与配置方案
  • Easysearch 数据迁移之 INFINI Gateway
  • 云计算-OpenStack 运维开发实战:从 Restful API 到 Python SDK 全场景实现镜像上传、用户创建、云主机部署全流程
  • OpenBMC 中命令模式的深度解析:从原理到实现
  • Flink中的窗口
  • HTML5 Canvas实现数组时钟代码,适用于wordpress侧边栏显示
  • 用 mock 把 ES 单元测试@elastic/elasticsearch-mock 上手
  • PyTorch基础(使用TensorFlow架构)
  • Nginx的SSL通配符证书自动续期
  • Python(二):MacBook安装 Python并运行第一个 Python 程序
  • docker搭建java运行环境(java或者springboot)
  • 项目五算:估算、概算、预算、结算、决算
  • 解决:nginx: [emerg] the “ssl“ parameter requires ngx_http_ssl_module
  • 《张朝阳的物理课》,呼应当下物理学习的“思维转向”
  • react与vue的对比,来实现标签内部类似v-for循环,v-if等功能
  • Avalon-MM协议
  • python之---递归选择文件并生成新文件保持目录结构
  • 《工程封装》(Python)
  • 一键式商品信息获取:京东API返回值深度挖掘
  • Dynamsoft Capture Vision Crack
  • AWS Bedrock Claude模型费用深度分析:企业AI成本优化指南
  • 卫星轨道基础知识
  • ICCV 2025 | 4相机干掉480机位?CMU MonoFusion高斯泼溅重构4D人体!
  • LaTeX(排版系统)Texlive(环境)Vscode(编辑器)环境配置与安装
  • Pytest项目_day14(参数化、数据驱动)
  • duiLib 利用布局文件显示一个窗口并响应事件
  • C语言零基础第15讲:字符函数和字符串函数
  • ThinkPHP+Mysql 灵活用工小程序-技术深度解析与实践指南
  • 对线面试官之幂等和去重