Java8中的Optional类
在工作室接触到了之前没用过的Optional
类,这是Java 8新增的一个类,搜了一下这是用以解决程序中常见的NullPointerException
异常问题。那就来记录一下Optional
类,以及如何用它消除代码中的null
检查。
避免使用null检查
Java开发的过程中,几乎所有人都遇到过NullPointerException
异常,大多数人遇到NullPointerException
异常时都会在异常出现的地方加上if
代码块来判断值不为空,举个例子
public void setUserToRole(User user) {
if (user != null) {
Long roleId = user.getRoleId();
if (roleId != null) {
Role role = roleService.findRoleByRoleId(roleId);
if (role != null) {
role.setUserId(user.getUserId());
roleDao.save(role);
}
}
}
}
这是一个普通的将用户和对应的角色绑定的方法,用于以后在讲角色和权限进行绑定区分,为了避免出现NullPointerException
异常,手动对可能为null
值进行了处理,不过代码看起来非常杂,业务逻辑被淹没在if
逻辑判断中,可以使用Optional来重构:
public void setUserToRole(User user) {
Optional<User> userOpt = Optional.ofNullable(user);
userOpt.ifPresent( u -> {
Long roleId = u.getRoleId();
Optional.ofNullable(roleId).ifPresent( rid -> {
Role role = roleService.findRoleByRoleId(rid);
Optional.ofNullable(role).ifPresent( r -> {
r.setUserId(u.getUserId());
roleService.save(r);
});
});
});
}
虽然看起来有点怪怪的,但是确实起到了效果哈哈
下面从最开始看看简单的逻辑的例子
创建Optional
对象
Optional
类提供类三个方法用于实例化一个Optional
对象,它们分别为empty()
、of()
、ofNullable()
,这三个方法都是静态方法,可以直接调用。
of()
方法创建一个非空对象
ofNullable()
方法用于创建一个可以为空的对象
empty()
方法用于创建一个没有值的Optional
对象:
User user1 = new User(1, "张三");
Optional<User> userOpt = Optional.of(user1);
Optional<User> userOpt = Optional.ofNullable(user1);
Optional<User> userOpt = Optional.empty();
获取Optional
对象的值
通常如果我们要获取User
对象中的name
属性值,常见的方式是直接获取:
String name = user.getName();
使用Optional
中提供的map()
方法可以以更简单的方式实现:
userOpt.map(u -> u.getName());
userOpt.map(User::getName);
//两种lambda写法
但是要注意的是,optional操作完得到的依然是Optinal
对象,可以使用.get()得到对应类型的数据,比如
String name = userOpt.map(User::getName).get();
orElse()
和orElseGet()
方法
实例对象存在则返回,否则提供默认值或者通过方法来设置返回值,比如
User user1 = new User(1, "张三");
User user2 = null;
Optional<User> userOpt = Optional.ofNullable(user1);
User user = userOpt.orElse(null);
System.out.println(user.getName()); //张三
Optional<User> userOpt = Optional.ofNullable(user2);
User user = userOpt.orElse(new User(1,"李四"));
System.out.println(user.getName()); //李四
isPresent()
和ifPresent()
方法
isPresent()
如果非空则返回true,空则返回false
if (userOpt.isPresent()) {
return userOpt.map(……);
} else {
return Collections.emptyList();
}
但是不建议这么写,因为这样和Java8之前的语法没有任何区别
if (user != null) {
````````
} else {
````````
}
现在可以换成使用ifPresent进行非空判断
userOpt.ifPresent(System.out::println);
map()
方法
上面说到map()用来获取对应的数据,map()还是可以无延伸的,比如获取用户名的大写,没有用户名则为null
user.map(u -> u.getName())
.map(name -> name.toUpperCase())
.orElse("null");
要是放在Java8以前是这么写的
User user = .....
if(user != null) {
String name = user.getUsername();
if(name != null) {
return name.toUpperCase();
} else {
return null;
}
} else {
return null;
}
上一篇: 【Java8】Optional类
下一篇: HttpUtils工具类