Optional的出现我认为是优雅的处理NPE问题的一个好方法。
在之前我处理NPE(Null Pointer Exceptio)问题的都这样的 这样写
User user = new User()
if(user!=null){
return user.getOrders();
}else{
return Collections.emptyList();
}
可以说是非常丑陋了,但是如果用Optional可以这样写
Optional<User> user = Optional.of(new User());
// map是遍历user类中的方法不为空则执行
user.map(u -> u.getOrders()).orElseGet(() -> Collections.emptyList());
一般的处理流程:
1. 创建Optional类型的数据
@Data
public class User {
private String name;
private Integer age;
private Optional<Address> address = Optional.empty();
}
@Data
public class Address {
private Optional<Street> street = Optional.empty();
}
@Data
public class Street {
private String streetName;
private Integer streetNo;
}
2. 判空判断的语句
Optional<User> userOptional = Optional.ofNullable(new User());
Integer streetNo = userOptional.orElse(new User()).getAddress().orElse(new Address()).getStreet().orElse(new Street()).getStreetNo();
// 等价于
User user = new User();
if (user != null) {
user.getAddress();
if ( user.getAddress() != null) {
Address address = new Address();
if (address.getStreet() != null) {
Street street = new Street();
Integer streetNo1 = street.getStreetNo();
}
}
}
这个写法也很好
Optional.ofNullable(new User())
.map(User::getAddress)
.map(Address::getStreet)
.map(Street::getStreetName)
.orElse("Java");
总而言之,“透过现象看本质”, Optional就是一个封装类,里面有map, orElse 等函数去帮我们做了一些判空的的操作。