程序猿日常开发中,为了避免NullPointerException异常,会写很多if else的判断。如果if else太多会让代码显的很乱,那如何减少if else的使用呢?
减少if else的方式之一,利用JDK8提供的Optional
ofNullable()、map()、orElseGet()的使用示例
示例中getStartTime()获取String类型的时间字符串并返回。执行逻辑:
- 调动selectStartTime()查询DB返回LocalDateTime值;
- 响应值dateTime如果为null,就给一个默认值;
- 响应值dateTime如果不为null,就把dateTime值转换成String类型的时间字符串并返回。
getStartTime()方法体用了5行代码。
private String getStartTime() {
LocalDateTime dateTime = selectStartTime();
if (dateTime == null) {
return "2020-01-01 00:00:00";
}
return dateTimeToString(dateTime);
}
private LocalDateTime selectStartTime(){
//去DB查找业务需要的LocalDateTime值
}
protected String dateTimeToString(LocalDateTime dateTime) {
if (dateTime == null) {
return null;
}
return DateTimeFormatter.ofPattern(Constants.DEFAULT_DATE_TIME_FORMAT).format(dateTime);
}
接着我们利用JDK8提供的Optional类,把以上5行代码简化成下面的1行代码。
private String getStartTime() {
return Optional.ofNullable(selectStartTime()).map(e->dateTimeToString(e)).orElseGet(()->"2020-01-01 00:00:00");
}
1行代码达到同样的效果。
ofNullable()、orElseGet()的使用示例
如果上面没看懂,那看一下这个简化版的示例:
User user = getCacheUser(1);
if (user == null) {
user = selectUserById(1);
}
static class User {
private String name;
private Address address;
//Get、Set方法
}
static class Address {
private String area;
private String province;
private String city;
//Get、Set方法
}
接着我们利用JDK8提供的Optional类,把以上4行代码简化成下面的1行代码。
User user = Optional.ofNullable(getCacheUser(1)).orElseGet(() -> selectUserById(1));
注意:Optional的orElseGet()的参数是一个函数式接口,只有在条件为null时才会执行orElseGet()里的方法,这是跟orElse()最大的区别,用orElseGet()性能会更好。
ofNullable()、map()、orElseGet()的使用示例
public String getCity(User user) throws Exception{
if(user!=null){
if(user.getAddress()!=null){
Address address = user.getAddress();
if(address.getCity()!=null){
return address.getCity();
}
}
}
throw new Excpetion("对象为空");
}
接着我们利用JDK8提供的Optional类,把以上多层if为空的判断简化成下面的1行代码。
public String getCity(User user) throws Exception{
return Optional.ofNullable(user)
.map(u-> u.getAddress())
.map(a->a.getCity())
.orElseThrow(()->new Exception("对象为空"));
}
ofNullable()、ifPresent()的使用示例
if(user!=null){
dosomething(user);
}
接着我们利用JDK8提供的Optional类,把以上3行代码简化成下面的1行代码。
Optional.ofNullable(user).ifPresent(u->dosomething(u));
ofNullable()、map()、orElseGet()的使用示例
public User getUser(User user) throws Exception{
if(user!=null){
String name = user.getName();
if("zhangsan".equals(name)){
return user;
}
}else{
user = new User();
user.setName("zhangsan");
return user;
}
}
接着我们利用JDK8提供的Optional类,把以上多层if为空的判断简化成下面的1行代码。
public User getUser(User user) {
return Optional.ofNullable(user)
.filter(u->"zhangsan".equals(u.getName()))
.orElseGet(()-> {
return new User("zhangsan");
});
}