文章大纲
- 开篇引言
- 第一部分:Optional类概述
- 第二部分:Optional核心方法详解
- 1. 值检测方法isPresent与isEmpty
- 2. 对象创建方法empty/of/ofNullable
- 3. 值获取与默认值处理方法
- 4. 条件执行与过滤方法
- 5. 值转换与扁平化处理
- 6. 流式操作支持
- 第三部分:Optional使用禁忌
- 核心要点总结
开篇引言
在Java开发中,处理空引用导致的NullPointerException异常是常见挑战。传统解决方案需要大量条件判断,严重影响代码可读性。例如:
if(user != null){
System.out.println(user.getFullName());
} else {
User defaultUser = new User("Stark", "Tony Stark");
System.out.println(defaultUser.getFullName());
}
本文基于教学视频内容,系统讲解Optional类的使用技巧。
视频资源:https://www.bilibili.com/video/BV1dc411X7nW
第一部分:Optional类概述
Optional类为Java开发者提供了更优雅的空值处理方案。它本质上是一个可能包含值的容器对象,强制开发者显式处理空值情况。该类支持函数式编程风格,可与Lambda表达式和Stream API无缝配合,有效减少传统if-else判断语句的使用。
第二部分:Optional核心方法详解
首先定义两个基础类:
User类实现:
public class User {
private String name;
private String fullName;
// 构造器与方法省略...
public Optional<String> getFullName(){
return Optional.ofNullable(fullName);
}
}
UserRepository类实现:
public class UserRepository {
public Optional<User> findUserByName(String name){
return name.equals("Peter")
? Optional.of(new User("Peter","Peter Parker"))
: Optional.empty();
}
}
1. 值检测方法isPresent与isEmpty
Optional<String> optional = Optional.empty();
System.out.println("值存在:" + optional.isPresent());
System.out.println("值为空:" + optional.isEmpty());
2. 对象创建方法empty/of/ofNullable
Optional.empty(); // 创建空对象
Optional.of("Peter"); // 非空对象创建
Optional.ofNullable(null); // 可能为空的对象
3. 值获取与默认值处理方法
// 直接获取(可能抛出异常)
String name = optional.get();
// 安全获取方式
User user = userRepo.findUserByName("Peter")
.orElse(new User("Default", "Default User"));
// 延迟创建默认值
User user = userRepo.findUserByName("Peter")
.orElseGet(() -> new User("Default", "Default User"));
// 异常抛出
userRepo.findUserByName("Unknown")
.orElseThrow(() -> new RuntimeException("用户不存在"));
4. 条件执行与过滤方法
// 条件执行
optionalUser.ifPresent(u -> System.out.println(u.getName()));
// 带备选方案的条件执行
optionalUser.ifPresentOrElse(
u -> System.out.println(u.getName()),
() -> System.out.println("未找到用户")
);
// 值过滤
Optional<User> filtered = optionalUser
.filter(u -> "Peter Parker".equals(u.getFullName()));
5. 值转换与扁平化处理
// 值转换
Optional<String> name = optionalUser.map(User::getName);
// 嵌套Optional处理
Optional<String> flatName = optionalUser.flatMap(User::getFullName);
6. 流式操作支持
optionalUser.stream()
.map(User::getName)
.forEach(System.out::println);
第三部分:Optional使用禁忌
- 避免作为类字段使用
- 不宜作为方法参数
- 不应作为构造器参数
- 集合类型无需二次包装
- 谨慎使用get()方法
核心要点总结
本文全面介绍了Optional类的应用场景和核心方法,并指出了常见的使用误区。合理运用Optional能显著提升代码质量和可维护性。
文章整理自互联网,只做测试使用。发布者:Lomu,转转请注明出处:https://www.it1024doc.com/9950.html