it编程 > 编程语言 > Java

Java 8 Optional解决空指针问题全面解析

1人参与 2025-10-25 Java

在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+)判断盒子是不是空的灯没亮就是空的
optional<string> opt = optional.of("数据");
system.out.println(opt.ispresent()); // 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)

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空指针内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

在 Kotlin 中ViewModel 的获取及使用指南

10-25

Java JDK封装数据结构的操作方法

10-25

nacos未自动注册问题及解决

10-25

MyBatis标签获取数组或集合长度的实现方式

10-25

java中instanceof的作用及说明

10-25

SpringBoot登录认证前后端实现方案:SpringBoot + Mybatis + JWT(图文实例)

10-25

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论