Java 在 Java 8 中引入 Optional<T>,主要是为了解决一个长期存在、却容易被忽视的问题:空指针异常(NullPointerException,简称 NPE),以及让“可能为空”这件事在代码层面变得显式、可读、可控。
下面从几个角度说明为什么引入 Optional。
在引入 Optional 之前,方法签名本身无法表达返回值是否可能为空:
public User getUserById(Long id)
调用者根本不知道:
null?这就导致:
if (x != null)public Optional<User> getUserById(Long id)
从类型层面告诉调用者:
“这个值可能不存在,你必须处理这种情况”
传统写法:
User user = getUserById(1L);
String name = user.getName(); // 可能 NPE
使用 Optional:
Optional<User> user = getUserById(1L);
String name = user
.map(User::getName)
.orElse("Unknown");
✅ 不写 null 判断
✅ 编译期提醒你要处理“空”的情况
✅ 逻辑更流畅
Optional 提供了一组语义清晰的方法:
isPresent() / isEmpty()ifPresent()map() / flatMap()filter()orElse() / orElseGet() / orElseThrow()示例:
Optional.ofNullable(user)
.filter(u -> u.getAge() > 18)
.ifPresent(u -> System.out.println(u.getName()));
相比嵌套 if,可读性和表达力更好。
null 在 Java 中有太多含义:
Optional 统一表示:
“这里可能没有值,但这是正常的业务状态”
需要注意:Optional 不是为了替代所有 null
官方明确建议:
// 不推荐
void foo(Optional<User> user)
// 推荐
void foo(User user)
Optional 的引入,是为了把“可能为 null”从隐式约定,变成显式类型,从而减少 NPE、提升代码可读性和健壮性。
如果你愿意,我也可以讲:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。