java 的 optional是 java 8 引入的一个容器类,旨在更优雅地处理可能为 null的值,避免显式的 null检查和空指针异常(nullpointerexception)。它的核心思想是强制开发者明确处理“值可能不存在”的情况,而不是隐式忽略。
一、optional 的核心作用
显式表示“值可能缺失”:通过类型系统提示调用者需要处理空值。
减少 null检查代码:提供链式方法替代嵌套的 if (obj != null)。
避免空指针异常:通过安全的方法访问潜在的空值。
二、创建 optional 对象
// 1. 创建一个非空值的 optional(若值为 null 会抛出 npe)
optional<string> optional1 = optional.of("hello");
// 2. 创建一个可能为 null 的 optional
string value = getnullablevalue(); // 可能返回 null
optional<string> optional2 = optional.ofnullable(value);
// 3. 创建一个空的 optional
optional<string> 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。
optional<string> uppercase = optional.map(string::touppercase); optional<integer> length = optional.flatmap(v -> optional.of(v.length())); optional<string> filtered = optional.filter(v -> v.length() > 3);
四、使用场景
方法返回值:明确表示返回值可能为空。
public optional<user> finduserbyid(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 结合使用:
list<string> names = users.stream()
.map(user -> user.getname().orelse("匿名"))
.collect(collectors.tolist());六、完整示例
public class optionaldemo {
public static void main(string[] args) {
optional<string> optional = 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用法内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论