目录
- 一、为什么需要 Optional
- 二、创建 Optional 的三种方式
- 三、判断是否有值
- 四、ifPresent:非空时执行动作
- 五、默认值(orElse / orElseGet)
- 六、get():危险的取值方法
- 七、filtehttp://www.devze.comr():过滤条件
- 八、map():转换值
在Java 8中,Optional类是一个非常重要的特性,旨在减少代码中的空指针异常(NullPointerException)。Optional类是java.util包的一部分,它是一个可以为null的引用或者一个非null的值。使用Optional可以让你更加优雅地处理可能为null的情况,避免直接使用null值导致的空指针异常。
一、为什么需要 Optional
在传统 Java 编程中,如果对象不存在(比如数据库查不到用户),通常返回 null,这就像你去某个城市找朋友——结果“朋友家空无一人”。
if (mem != null) {
System.out.println(mem.getName());
}
这就像你每次出门都要确认朋友家是不是有人,十分麻烦。而 Optional 就是一个智能快递柜——
它告诉你:这个格子里可能有包裹,也可能是空的,但不会让你“踩空”。
二、创建 Optional 的三种方式
| 方法 | 含义 | 城市类比 |
|---|---|---|
Optional.empty() | 创建一个空盒子 | 空快递柜,没有包裹 |
Optional.of(value) | 创建一个非空盒子(不能为 null) | 放了包裹的柜子 |
Optional.ofNullable(value) | 创建一个可空盒子 | 可能有包裹,也可能没有 |
Optional<String> opt1 = Optional.empty();
Optional<String> opt2 = Optional.of("一成");
Optional<String> opt3 = Optional.ofNullable(null);
三、判断是否有值
| 方法 | 说明 | 类比 |
|---|---|---|
isPresent() | 判断盒子里有没有东西 | 看柜门上有没有“取件提示灯”亮 |
isEmpty()(Java 11+) | 判断盒子是不是空的 | 灯没亮就是空的 |
Optionphpal<String> opt = Optional.of("数据");
System.out.println(opt.isPresent())python; // true
四、ifPresent:非空时执行动作
不用写 if 判空,而是让 Optional 自动帮你执行:
opt.ifPresent(str -> System.out.println(str.length()));
类比:
你设置了一个提醒器——“如果包裹到了,就发短信告诉我”;没到就静静等待。
Java 9 之后还可以这样:
opt.ifPresentOrElse(
str -> System.out.println(str.length()),
() ->编程客栈; System.out.println("为空")
);
五、默认值(orElse / orElseGet)
orElse():无论有没有包裹,都先去取默认包裹(性能略差)orElseGet():只有真空柜时,才生成默认包裹(性能更好)
String name = Optional.ofNullable(null).orElse("默认名");
String name2 = Optional.ofNullable(null).orElseGet(() -> "默认名");
类比:
orElse是“先去仓库拿备用包裹再来看柜子”;orElseGet是“只有柜子真空了才让仓库发货”。
六、get():危险的取值方法
get() 就像强行撬柜门——如果柜子是空的会抛异常:
opt.get(); // 如果为空,抛 NoSuchElementException
不推荐使用,应改用 orElseGet() 或 ifPresent()。
七、filter():过滤条件
Optional<String> pwd = Optional.of("1234567");
boolean valid = pwd.filter(p -> p.length() > 6).isPresent();
类比:
快递柜自动帮你过滤“不符合条件的包裹”,例如“包裹太大或太小”直接拒收。
可以组合多个条件:
Predicate<String> len6 = p -> p.length() > 6; Predicate<String> len10 = p -> p.length() < 10; pwd.filter(len6.and(len10)).isPresent();
八、map():转换值
map() 是将盒子里的内容按规则变形再放回盒子。
Optional<String> nameOpt = Optional.of("一成");
Optional<Integer> lenOpt = nameOpt.map(String::length);
类比:
你把包裹(字符串)拿出来,测量它的重量(长度),再放进另一个盒子。
还可以结合 filter:
Optional<String> opt = Optional.of("password");
boolean result = opt
.map(String::toLowerCase)
.filter(pwd -> !pwd.equals("password"))
.isPresent();
| 操作 | 方法 | 功能类比 | 推荐程度 |
|---|---|---|---|
| 创建空值 | Optional.empty() | 空柜子 | ✅ |
| 创建非空值 | Optional.of() | 有包裹的柜子 | ✅(参数不能为 null) |
| 创建可空值 | Optional.ofNullable() | 不确定是否有包裹 | ✅ |
| 判断存在 | isPresent() / isEmpty() | 查看灯亮不亮 | ✅ |
| 执行动作 | ifPresent() / ifPresentOrElse() | 到货通知 | ✅ |
| 默认值 | orElse() / orElseGet() | 备用包裹 | ✅(推荐 orElseGet) |
| 获取值 | get() | 撬柜门 | ❌(可能抛异常) |
| 条件过滤 | filter() | 包裹筛选 | ✅ |
| 值转换 | map() | 包裹改造 | ✅ |
到此这篇关于Java 8编程 Optional解决空指针问题的文章就介绍到这了,更多相关Java Optional空指针内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论