1人参与 • 2025-10-25 • Java
在java 8中,optional类是一个非常重要的特性,旨在减少代码中的空指针异常(nullpointerexception)。optional类是java.util包的一部分,它是一个可以为null的引用或者一个非null的值。使用optional可以让你更加优雅地处理可能为null的情况,避免直接使用null值导致的空指针异常。
在传统 java 编程中,如果对象不存在(比如数据库查不到用户),通常返回 null,这就像你去某个城市找朋友——结果“朋友家空无一人”。
于是我们不得不在每个地方加上判空逻辑:
if (mem != null) {
system.out.println(mem.getname());
}
这就像你每次出门都要确认朋友家是不是有人,十分麻烦。而 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+) | 判断盒子是不是空的 | 灯没亮就是空的 |
optional<string> opt = optional.of("数据");
system.out.println(opt.ispresent()); // true
不用写 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():只有真空柜时,才生成默认包裹(性能更好)string name = optional.ofnullable(null).orelse("默认名");
string name2 = optional.ofnullable(null).orelseget(() -> "默认名");
类比:
orelse是“先去仓库拿备用包裹再来看柜子”;orelseget是“只有柜子真空了才让仓库发货”。
get() 就像强行撬柜门——如果柜子是空的会抛异常:
opt.get(); // 如果为空,抛 nosuchelementexception
不推荐使用,应改用 orelseget() 或 ifpresent()。
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() 是将盒子里的内容按规则变形再放回盒子。
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空指针内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论