Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。
用户信息:
public class User {
/**
* id
**/
private Integer id;
/**
* 用户code
**/
private String userCode;
/**
* 用户姓名
**/
private String userName;
/**
* 用户性别
**/
private Integer sex;
/**
* 用户角色
**/
private Role role;
}
用户角色信息:
public class Role {
/**
* id
**/
private Integer id;
/**
* 用户code
**/
private String userCode;
/**
* 角色code
**/
private String roleCode;
/**
* 角色名字
**/
private String roleName;
}
该方式的入参可以为null,当入参不确定为非null时使用。
public static void main(String[] args) {
//user不确定是非null
User user = xxx;
Optional<User> userOptional = Optional.ofNullable(user);
}
该方式的入参不能为null,否则会有NPE,在确定入参不为空时使用该方式。
public static void main(String[] args) {
User user = new User();
user.setId(1);
user.setUserCode("U123456");
user.setUserName("张三");
user.setSex(1);
Role role = new Role();
role.setId(1);
role.setUserCode("U123456");
role.setRoleCode("R123456");
role.setRoleName("管理员");
user.setRole(role);
//user肯定是非空的,不为空的不能使用of,会抛异常
Optional<User> userOptional = Optional.of(user);
}
这种方式是返回一个空Optional,等效Optional.ofNullable(null)
场景一:获取用户角色名称
if写法:
/**
* 获取用户角色名称
**/
private String getUserRoleName(User user) {
if (Objects.nonNull(user)) {
Role userRole = user.getRole();
if (Objects.nonNull(userRole)) {
return userRole.getRoleName();
}
}
return null;
}
Optional写法
/**
* 获取用户角色名称Optional
**/
private String getUserRoleNameOptional(User user) {
return Optional.ofNullable(user).map(u -> u.getRole()).map(r -> r.getRoleName()).orElse(null);
}
场景二:如果用户存在返回用户名,不存在返回李四
if写法:
private String getUserRoleName(User user) {
if (Objects.nonNull(user)) {
return user.getUserName();
}
return "李四";
}
Optional写法:
private String getUserRoleNameOptional(User user) {
return Optional.ofNullable(user).map(u -> u.getUserName()).orElse("李四");
}
场景:如果user存在,则把user姓名改为李四,不存在不做处理
Optional.ofNullable(user).ifPresent(u -> {
u.setUserName("李四");
});
存在即返回, 无则提供默认值
Optional.ofNullable(user).orElse(null);
存在即返回, 无则由函数来产生
Optional.ofNullable(user).orElseGet(()-> xxx逻辑处理);
如果有值并且满足条件返回包含该值的Optional,否则返回空Optional
Optional.ofNullable(user).filter(u -> u.getSex() > 18)
flatMap与map方法类似,区别在于flatMap中的返回值必须是Optional。调用结束时,flatMap不会对结果用Optional封装
Optional<Role> optionalRole = Optional.ofNullable(user).flatMap(u -> Optional.of(u.getRole()));
有值时直接返回, 无值时抛出想要的异常.
Optional.of(user).orElseThrow(() -> new RuntimeException("错误"));