Java 1.8 Optional 杜绝空指针异常
一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / Java 学习路线 / 一对一提问 / 学习打卡/ 赠书活动
目前,正在
星球
内带小伙伴们做第一个项目:全栈前后端分离博客项目,采用技术栈 Spring Boot + Mybatis Plus + Vue 3.2 + Vite 4
,手把手,前端 + 后端全栈开发,从 0 到 1 讲解每个功能点开发步骤,1v1 答疑,陪伴式直到项目上线,目前已更新了 144 小节,累计 22w+ 字,讲解图:923 张,还在持续爆肝中,后续还会上新更多项目,目标是将 Java 领域典型的项目都整上,如秒杀系统、在线商城、IM 即时通讯、权限管理等等,已有 440+ 小伙伴加入,欢迎点击围观
。
在 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,我们可以避免空指针异常,并且可以更加优雅地处理可能为空的对象。