Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
创建 Option
Optional 有两个函数(of & ofNullable)可以传参初始化。一个empty函数没有参数。

empty
empty
函数就是,直接返回 new Optional()
并且 value
为空 null
。

of & ofNullable
of
首先看 of
我们发现这个函数就是将 Optional
中 value
的值赋值为参数传入的 value
值,假如传入的值为空 null
则抛出异常。源码如下:

ofNullable
而 ofNullable
就是将前两个函数 empty
和 of
结合起来,首先判断传入的值 value
是否为空 null
, 为空就调用 empty
函数, 不为空就调用 of
函数。

所以一般我们使用 ofNullable 函数来初始化 Optional 对象,方便之后调用它的方法。
应用
/**
* 用于测试的 User 类
*/
@Data
@AllArgsConstructor
public static class User {
String name;
int id;
}
获取对象下某属性的值,原来需要判断一下 user
是否为空,不为空再获取 name
属性,现在可以通过 orElse
一行实现。
public static void main(String[] args) {
User user1 = null;
String u1 = Optional.ofNullable(user1).map(User::getName).orElse("default");
User user2 = new User(null, 12);
String u2 = Optional.ofNullable(user2).map(User::getName).orElse("default");
User user3 = new User("Sajor", 12);
String u3 = Optional.ofNullable(user3).map(User::getName).orElse("default");
System.out.println(u1); // default
System.out.println(u2); // default
System.out.println(u3); // SAJOR
}
再进一步也可以通过 map
来持续对对象下属性进行更复杂的操作。
public static void main(String[] args) {
// 通过变大写函数
String u1 = Optional.ofNullable(user1).map(User::getName).map(String::toUpperCase).orElse("default");
User user2 = new User(null, 12);
String u2 = Optional.ofNullable(user2).map(User::getName).map(String::toUpperCase).orElse("default");
User user3 = new User("Sajor", 12);
String u3 = Optional.ofNullable(user3).map(User::getName).map(String::toUpperCase).orElse("default");
// 通过过滤
User user4 = new User("Sajor", 12);
String u4 = Optional.ofNullable(user4).map(User::getName).map(String::toUpperCase).filter(s -> s.equals("SAJOR")).orElse("default");
User user5 = new User("Sajor", 12);
String u5 = Optional.ofNullable(user5).map(User::getName).map(String::toUpperCase).filter(s -> s.equals("sajor")).orElse("default");
System.out.println(u1); // default
System.out.println(u2); // default
System.out.println(u3); // SAJOR
System.out.println(u4); // SAJOR
System.out.println(u5); // default
}
也可以通过 ifPresent
函数修改对象下的属性
public static void main(String[] args) {
// 修改属性
User user1 = new User(null, 12);
Optional.ofNullable(user1).ifPresent(user -> {
user.setId(13);
user.setName("Sajor");
});
User user2 = null;
Optional.ofNullable(user2).ifPresent(user -> {
user.setId(13);
user.setName("Sajor");
});
System.out.println(user1); // User(name=Sajor, id=13)
System.out.println(user2); // null
}