java 的optional
是 java 8 引入的一个容器类,旨在更优雅地处理可能为null
的值,避免显式的null
检查和空指针异常(nullpointerexception
)。它的核心思想是强制开发者明确处理“值可能不存在”的情况,而不是隐式忽略。
一、optional 的核心作用
显式表示“值可能缺失”:通过类型系统提示调用者需要处理空值。
减少null
检查代码:提供链式方法替代嵌套的if (obj != null)
。
避免空指针异常:通过安全的方法访问潜在的空值。
二、创建 optional 对象
// 1. 创建一个非空值的 optional(若值为 null 会抛出 npe) optionaloptional1 = optional.of("hello"); // 2. 创建一个可能为 null 的 optional string value = getnullablevalue(); // 可能返回 null optional optional2 = optional.ofnullable(value); // 3. 创建一个空的 optional optional optional3 = optional.empty();
三、optional 的常用方法
1.检查值是否存在
ispresent()
:判断值是否存在。isempty()
(java 11+):判断值是否为空。
if (optional.ispresent()) { system.out.println("值存在: " + optional.get()); }
2.值存在时执行操作
ifpresent(consumer)
: 值存在时执行操作。
optional.ifpresent(v -> system.out.println("值为: " + v));
3.获取值
get()
:直接获取值(若值为空会抛异常,需谨慎使用)。orelse(t)
: 值存在时返回值,否则返回默认值。orelseget(supplier)
: 延迟生成默认值。orelsethrow()
: 值不存在时抛出异常(可自定义异常)。
string result = optional.orelse("默认值"); string result = optional.orelseget(() -> generatedefault()); string result = optional.orelsethrow(() -> new notfoundexception("值不存在"));
4.链式操作
map(function)
: 对值进行转换(若值为空,直接返回空 optional)。flatmap(function)
: 与map
类似,但用于返回 optional 的函数。filter(predicate)
: 过滤值,不满足条件则返回空 optional。
optionaluppercase = optional.map(string::touppercase); optional length = optional.flatmap(v -> optional.of(v.length())); optional filtered = optional.filter(v -> v.length() > 3);
四、使用场景
方法返回值:明确表示返回值可能为空。
public optionalfinduserbyid(int id) { // 查询数据库,可能返回 null return optional.ofnullable(userrepository.findbyid(id)); }
链式处理可能为空的值:
string city = useroptional .map(user::getaddress) .map(address::getcity) .orelse("未知城市");
替代if-else
嵌套:
// 传统方式 if (user != null && user.getaddress() != null) { // ... } // optional 方式 useroptional.flatmap(user::getaddress).ifpresent(address -> { // ... });
五、最佳实践与注意事项
避免以下情况:
将optional
作为字段、方法参数或集合元素(违背设计初衷)。
过度使用optional
,导致代码冗余。
直接调用get()
而不检查是否存在值。
优先使用orelse/orelseget
替代ispresent()
:
// 不推荐 if (optional.ispresent()) { return optional.get(); } else { return "default"; } // 推荐 return optional.orelse("default");
与 stream 结合使用:
listnames = users.stream() .map(user -> user.getname().orelse("匿名")) .collect(collectors.tolist());
六、完整示例
public class optionaldemo { public static void main(string[] args) { optionaloptional = optional.ofnullable(getnullablestring()); string value = optional .map(string::touppercase) .filter(s -> s.length() > 3) .orelse("default"); system.out.println(value); // 输出 "default" 或处理后的值 } private static string getnullablestring() { return math.random() > 0.5 ? "hello" : null; } }
到此这篇关于java optional介绍和用法的文章就介绍到这了,更多相关java optional用法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
海报
109