Optional工具类
Optional是一个容器对象,可以包含或不包含非空值。它用于处理可能为null
的值,避免了空指针异常的发生,同时提高了代码的可读性和健壮性。 Optional是函数式编程的一部分,用于表示可能存在或不存在的值。
方法介绍
方法名 | 描述 |
---|---|
static of(T t) | 创建一个非空的Optional,若t为空会NPE |
static ofNullable(T t) | 创建一个可为空的Optional |
filter(Predicate<super T> predicate) | 对源对象做过滤,不满足条件返回空的Optional |
map(Function<super T, ? extends U> mapper) | 对非空的Optional做转换 |
flatMap(Function<super T, Optional<U>> mapper) | 将非空Optional转换为其他的Optional |
orElse(T other) | 若Optional为空,则返回给定值 |
orElseGet(Supplier<extends T> other) | 若Optional为空,则返回提供器的值 |
orElseThrow(Supplier<extends X> exceptionSupplier) | 若Optional为空,则抛出异常提供器的异常 |
WARNING
注意orElse
和orElseGet
的区别,若是常量,则使用orElse
,否则尽量都使用orElseGet
扩展工具类
- OptionalDouble:用于处理
double
类型的非空Optional - OptionalInt:用于处理
int
类型的非空Optional - OptionalLong:用于处理
long
类型的非空Optional
示例
java
public class OptionalTest {
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@Accessors(chain = true)
static class User {
String firstName;
String lastName;
String age;
List<String> addresses;
public int getRequiredAge() {
return
Optional.ofNullable(this.age)
.map(Integer::parseInt)
// 年龄为空 抛出异常
.orElseThrow(() -> new RuntimeException("年龄为空了!"));
}
}
public static void main(String[] args) {
User user = new User();
// 数字年龄解析
// 若年龄字符串为空 默认值为0
int age = Optional.ofNullable(user.getAge()).map(Integer::parseInt).orElse(0);
System.out.printf("orElse年龄为:%d%n", age);
// 若年龄字符串为空 使用一个随机年龄
age = Optional.ofNullable(user.getAge()).map(Integer::parseInt).orElseGet(() -> new SecureRandom().nextInt());
System.out.printf("orElseGet年龄为:%d%n", age);
// 若年龄为空 抛出异常
try {
age = user.getRequiredAge();
} catch (Exception e) {
// 保证main正常执行 未实际抛出异常
e.printStackTrace(System.err);
}
// 重新设置年龄
user.setAge("18");
System.out.printf("正常年龄解析:%d%n", user.getRequiredAge());
// 是否非空及过滤
user.setLastName("");
boolean present =
Optional.of(user)
// 姓名不能为空字符串或null
.filter(it -> Objects.nonNull(it.getFirstName()) && !it.getFirstName().trim().isEmpty())
.filter(it -> Objects.nonNull(it.getLastName()) && !it.getLastName().trim().isEmpty())
.isPresent();
System.out.println(present);
// 当非空是才处理
Optional.ofNullable(user.getAge())
.filter(it -> !it.trim().isEmpty())
.ifPresent(it -> {
System.out.printf("年龄为%s不是空的%n", it);
// 做其他事情...
});
}
}
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61