Java 1.8 Optional 杜绝空指针异常
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
截止目前, 星球 内专栏累计输出 72w+ 字,讲解图 3103+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2400+ 小伙伴加入学习 ,欢迎点击围观
在 Java 1.8 中,Optional 是一个用于处理可能为 null
的值的容器类。它提供了一种优雅的方式来避免空指针异常,并且可以用于优雅地处理可能为空的对象。
本教程将深入介绍 Java 1.8 中的 Optional 类,并通过示例代码演示如何使用它。
Optional 类概览
在 java.util
包中,Optional 类定义如下:
public final class Optional<T> {
// 构造函数、静态工厂方法和其他方法
}
Optional 是一个泛型类,它可以包装任意类型的值。
创建 Optional 对象
你可以使用以下方法来创建 Optional 对象:
1. of() 方法
Optional<String> optionalValue = Optional.of("Hello, World!");
使用 of()
方法创建一个非空的 Optional 对象,如果传入的值为 null,则会立即抛出 NullPointerException
。
2. ofNullable() 方法
Optional<String> optionalValue = Optional.ofNullable(null);
使用 ofNullable()
方法创建一个 Optional 对象,如果传入的值为 null,则会创建一个空的 Optional 对象。
3. empty() 方法
Optional<String> optionalValue = Optional.empty();
使用 empty()
方法创建一个空的 Optional 对象,表示该 Optional 对象没有值。
使用 Optional 对象
Optional 提供了一系列方法来处理可能为 null
的值。
1. isPresent() 方法
Optional<String> optionalValue = Optional.of("Hello, World!");
if (optionalValue.isPresent()) {
System.out.println("Value is present: " + optionalValue.get());
} else {
System.out.println("Value is not present.");
}
isPresent()
方法用于判断 Optional 对象是否包含值。如果包含值,则返回 true
,否则返回 false
。
2. ifPresent() 方法
Optional<String> optionalValue = Optional.of("Hello, World!");
optionalValue.ifPresent(value -> System.out.println("Value is present: " + value));
ifPresent()
方法用于在 Optional 对象包含值的情况下执行给定的操作。如果 Optional 包含值,则会执行 Lambda 表达式,否则不会执行任何操作。
3. orElse() 方法
Optional<String> optionalValue = Optional.empty();
String result = optionalValue.orElse("Default Value");
System.out.println("Result: " + result);
orElse()
方法用于获取 Optional 对象的值。如果 Optional 对象包含值,则返回该值,否则返回传入的默认值。
4. orElseGet() 方法
javaCopy codeOptional<String> optionalValue = Optional.empty();
String result = optionalValue.orElseGet(() -> "Default Value");
System.out.println("Result: " + result);
orElseGet()
方法与 orElse()
方法类似,但传入的参数是一个 Supplier 函数 ,可以用于生成默认值。
5. orElseThrow() 方法
Optional<String> optionalValue = Optional.empty();
String result = optionalValue.orElseThrow(() -> new IllegalArgumentException("Value not present"));
System.out.println("Result: " + result);
orElseThrow()
方法用于在 Optional 对象为空时抛出异常。如果 Optional 包含值,则返回该值,否则抛出指定的异常。
链式调用
Optional 还支持链式调用,可以在一系列操作中依次处理 Optional 对象。
Optional<String> optionalValue = Optional.of("Hello, World!");
optionalValue.map(String::toUpperCase).ifPresent(value -> System.out.println("Uppercase value: " + value));
在这个例子中,我们使用 map()
方法将值转换为大写形式,并使用 ifPresent()
方法在 Optional 对象包含值时打印大写的结果。
总结
Java 1.8 中的 Optional 类为处理可能为 null
的值提供了优雅的解决方案。通过使用 Optional,我们可以避免空指针异常,并且可以更加优雅地处理可能为空的对象。