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

【后端】Java 8 特性 Optional 可选类 介绍

文章目录

      • Java 8 `Optional` 类详解
        • 一、核心目的
        • 二、创建 `Optional` 对象
        • 三、关键方法及使用场景
        • 四、代码示例
        • 五、最佳实践与注意事项
        • 六、设计哲学

Java 8 Optional 类详解

Optional 是 Java 8 引入的容器类(位于 java.util 包),用于优雅地处理可能为 null 的值,避免显式的 null 检查和空指针异常(NullPointerException)。


一、核心目的
  • 显式处理空值:强制开发者考虑值缺失的场景。
  • 减少空指针异常:通过链式调用替代嵌套的 if (obj != null) 检查。
  • 表达意图:明确声明方法可能返回空值(替代 Javadoc 说明)。

二、创建 Optional 对象
方法描述示例
Optional.empty()创建空容器Optional.empty()
Optional.of(T value)创建非空容器(value 不可为 nullOptional.of("Hello")
Optional.ofNullable(T value)创建容器(允许 valuenullOptional.ofNullable(null)
Optional<String> emptyOpt = Optional.empty(); // 空容器
Optional<String> strOpt = Optional.of("Java"); // 非空值
Optional<String> nullableOpt = Optional.ofNullable(null); // 可为null

三、关键方法及使用场景
方法描述典型应用场景
isPresent()检查值是否存在替代 if (obj != null)
ifPresent(Consumer<? super T> action)值存在时执行操作简化空值检查后的操作
get()获取值(需先校验存在性)配合 isPresent() 使用(不推荐直接调用)
orElse(T other)值存在时返回值,否则返回默认值提供兜底值(如默认配置)
orElseGet(Supplier<? extends T> supplier)值存在时返回值,否则执行 Supplier 生成值延迟构造代价大的默认对象
orElseThrow(Supplier<? extends X> exceptionSupplier)值存在时返回值,否则抛出异常强制要求值存在的场景(如数据验证)
filter(Predicate<? super T> predicate)值存在且满足条件时返回原容器,否则返回空条件过滤
map(Function<? super T, ? extends U> mapper)值存在时执行转换,返回新 Optional链式转换值(如从对象中提取字段)
flatMap(Function<? super T, Optional<U>> mapper)展平嵌套的 Optional(避免 Optional<Optional<T>>连续操作返回 Optional 的方法

四、代码示例
  1. 基础使用
String name = "Alice";
Optional<String> nameOpt = Optional.ofNullable(name);// 存在时输出
nameOpt.ifPresent(System.out::println); // 输出 "Alice"// 不存在时提供默认值
String result = nameOpt.orElse("Unknown");
  1. 链式操作
public class User {private Address address;public Optional<Address> getAddress() { return Optional.ofNullable(address); }
}public class Address {private String city;public Optional<String> getCity() { return Optional.ofNullable(city); }
}// 获取用户的城巿(不存在时返回默认值)
String city = Optional.ofNullable(user).flatMap(User::getAddress) // 展平嵌套 Optional.flatMap(Address::getCity).orElse("Unknown City");
  1. 条件过滤
Optional<User> userOpt = Optional.ofNullable(user);
// 仅当用户年龄大于18时返回
Optional<User> adult = userOpt.filter(u -> u.getAge() > 18);
  1. 异常处理
// 值不存在时抛出自定义异常
User user = userOpt.orElseThrow(() -> new IllegalArgumentException("User not found!"));

五、最佳实践与注意事项
  1. 避免以下情况

    • Optional 替代空集合:返回空集合(如 Collections.emptyList())更合适。
    • 作为方法参数:会导致代码冗余。
    • 直接调用 get() :须先调用 isPresent() 检查。
    • 字段声明:破坏序列化(Optional 未实现 Serializable)。
  2. 推荐用法

    • 返回值:明确声明方法可能返回空值。
    • 链式调用:结合 map()flatMap()filter() 安全处理嵌套对象。

六、设计哲学

Optional 的核心是鼓励函数式风格防御性编程。通过显式处理空值,代码可读性和健壮性显著提升,是 Java 对空值问题的重要解决方案。

📌 关键点Optional 不是万能的,但合理使用能减少 70% 的空指针异常!

http://www.dtcms.com/a/324093.html

相关文章:

  • Oracle 19C 查看卡慢的解决思路
  • Spring Boot整合knife4j实战
  • iceberg安装部署
  • imx6ull支持4G模块
  • C++高频知识点(十八)
  • 生产环境中Spring Cloud Sleuth与Zipkin分布式链路追踪实战经验分享
  • 咪咕MGV3200-KLH_GK6323V100C_板号E503744_安卓9_短接强刷包-可救砖
  • uni-app 网络请求终极选型:uni.request、axios、uni-network、alova 谁才是你的真命请求库?
  • CD64.【C++ Dev】多态(3): 反汇编剖析单继承下的虚函数表
  • CPP继承
  • Qt—— 下载、工具介绍以及新建项目
  • 机器学习 [白板推导](八)[EM算法]
  • 机器学习-----K-means算法介绍
  • 打靶日常-XSS(反射型和存储型)
  • UE材质World Position 和 Object Position
  • 第十章:发布与展望 —— 让你的作品在 Edge 中闪耀
  • 力扣(买卖股票的最佳时机I/II)
  • 苍穹外卖-Day1 | 环境搭建、nginx、git、令牌、登录加密、接口文档、Swagger
  • 九、Linux Shell脚本:运算符与表达式
  • 在Ansys Simplorer中设计三相逆变器,并与Maxwell FEA耦合,实现160kW PMSM
  • AI浏览器与传统爬虫范式的技术冲突:重构互联网信息获取的伦理与实践
  • JVM调优好用的内存分析工具!
  • PHP版本控制系统:高效文档管理
  • 精准计算Word文档页数的PHP类
  • 【Redis】持久化方案——RDB和AOF
  • 5Python异常处理与模块导入全指南
  • nginx 反向代理传递原始域名
  • Linux 管道命令及相关命令练习与 Shell 编程、Tomcat 安装
  • Spring AOP 底层实现(面试重点难点)
  • 区块链让物联网真正链接万物