空检查属性获取工具 - Opt
# 空检查属性获取工具 - Opt
介绍
在嵌套对象的属性获取中,由于子对象可能为 null
,通常需要对每一层对象进行 null
检查,这会使代码变得非常冗长和复杂。Opt
工具类通过链式调用的方式,优雅地实现了空检查和属性获取,使代码更简洁和安全。
声明:此类的作者:阿超 (opens new window) (opens new window)。
核心功能
- 空值安全处理:避免空指针异常,优雅地处理
null
值。 - 链式调用:支持链式调用,简化嵌套对象的属性获取。
- 扩展原生
Optional
功能:提供比 JDK 原生Optional
更加丰富和便捷的功能,如空白字符串处理、默认值获取、链式执行等。
# 1. 空检查和属性获取
Opt.ofNullable
用于创建一个可为空的 Opt
对象,并通过链式调用获取嵌套对象的属性。
# 示例:获取嵌套属性值
import cn.hutool.core.lang.Opt;
import lombok.Data;
public class OptExample {
public static void main(String[] args) {
// 创建一个用户对象,但未设置学校信息
User user = new User();
user.setName("hello");
// 获取学校地址,由于学校对象为null,最终返回null
String addressValue = Opt.ofNullable(user)
.map(User::getSchool) // 获取School对象
.map(User.School::getAddress) // 获取School对象中的address字段
.get();
System.out.println(addressValue); // 输出:null
}
@Data
public static class User {
private String name;
private String gender;
private School school;
@Data
public static class School {
private String name;
private String address;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
关键点:
Opt.ofNullable(T value)
:创建一个可为空的Opt
对象。如果传入null
,则Opt
对象中不包含值。map(Function<? super T, ? extends U> mapper)
:通过指定的方法获取对象的下一级属性。get()
:获取最终值,如果中途有任何一个对象为null
,返回null
而不会抛出异常。
实际开发场景:在获取嵌套对象的属性时,通过链式调用可以避免繁琐的空检查。
# 2. 空白字符串处理
Opt.ofBlankAble
处理空白字符串的场景。如果字符串为 null
或空白,返回指定的默认值。
# 示例:处理空白字符串
import cn.hutool.core.lang.Opt;
public class OptExample {
public static void main(String[] args) {
// 字符串为空白时,返回默认值
String result = Opt.ofBlankAble("").orElse("hutool");
System.out.println(result); // 输出:hutool
}
}
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
关键点:
Opt.ofBlankAble(String value)
:处理空白字符串,null
或空白字符串将视为无效值。
实际开发场景:在处理用户输入时,常常需要判断空白字符串并使用默认值替代。
# 3. 获取默认值和抛出异常
Opt.get()
:获取最终值,若值不存在,则返回null
。orElse(T other)
:如果值不存在,返回指定的默认值。orElseThrow(Supplier<? extends X> exceptionSupplier)
:值不存在时抛出自定义异常。orElseThrow(Function<String, RuntimeException> exceptionSupplier, String message)
:支持双冒号传入异常类型和自定义提示信息。
# 示例:获取值或抛出异常
import cn.hutool.core.lang.Opt;
public class OptExample {
public static void main(String[] args) {
// 使用 orElseThrow 抛出异常
try {
Opt.ofNullable(null).orElseThrow(IllegalArgumentException::new, "值不存在!");
} catch (IllegalArgumentException e) {
System.err.println(e.getMessage()); // 输出:值不存在!
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
实际开发场景:在关键操作中,如果获取的值不存在,可以通过抛出异常来确保代码的安全性。
# 4. 存在值时的操作
Opt
提供了一些方法来对存在的值进行操作,如 ifPresentOrElse
和 peek
。
# 示例:条件执行和链式操作
import cn.hutool.core.lang.Opt;
public class OptExample {
public static void main(String[] args) {
// 根据值的存在情况执行不同操作
Opt.ofNullable("Hello Hutool!")
.ifPresentOrElse(System.out::println, () -> System.err.println("Ops! Something is wrong!"));
// 如果值不存在,输出错误提示
Opt.empty().ifPresentOrElse(System.out::println, () -> System.err.println("Ops! Something is wrong!"));
// 链式调用,执行多次操作
User user = new User();
Opt.ofNullable("hutool").peek(user::setName).peek(user::setGender);
System.out.println(user.getName()); // 输出:hutool
}
public static class User {
private String name;
private String gender;
public void setName(String name) {
this.name = name;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getName() {
return name;
}
public String getGender() {
return gender;
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
关键点:
ifPresentOrElse(Consumer<? super T> action, Runnable emptyAction)
:根据值是否存在执行不同操作。peek(Consumer<? super T> action)
:链式执行指定操作。
实际开发场景:在值存在时执行一系列操作,常用于数据处理和更新。
# 5. 替代值获取
Opt.or
用于在值不存在时,提供替代的 Opt
对象,并继续链式调用。
# 示例:使用替代值
import cn.hutool.core.lang.Opt;
public class OptExample {
public static void main(String[] args) {
// 使用替代的 Opt 对象
String str = Opt.<String>ofNullable(null)
.or(() -> Opt.ofNullable("Hello hutool!"))
.map(String::toUpperCase)
.orElseThrow();
System.out.println(str); // 输出:HELLO HUTOOL!
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
实际开发场景:在获取不到值时,提供替代的值或进一步处理。
# 6. 快捷的 Lambda 调试
通过使用 Opt
的 Lambda 调试功能,开发者可以快速实现链式操作并进行调试。IDEA 的 Lambda 自动补全和优化功能,帮助开发者更高效地完成编码。
总结
Opt
工具类在日常开发中极大地简化了空检查和属性获取的代码,同时提供了丰富的链式操作功能,使代码更加优雅和简洁。通过 Opt
,你可以轻松处理复杂对象嵌套、空白字符串、异常抛出等场景,同时享受到比原生 Optional
更丰富的 API 支持。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08