JDK8中Optional对象使用的空对象模式
Optional的使用可以避免空指针的异常,同时又写出优雅简洁的java代码。 Optional类中有以下几个重要的方法:
- ofNullable()方法:为指定的值创建一个Optional ,如果指定的值为null,则返回一个空的Optional对象;
- orElse()方法:如果有值则将其返回,否则返回指定的其他值
- map()方法:如果创建的Optional中的值存在,对该值执行提供的Function函数调用;
- flatMap()方法:如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Opthional对象。
public class Country {
public Country(String isoCode) {
this.isoCode = isoCode;
}
private String isoCode;
public String getIsocode() {
return isoCode;
}
public void setIsocode(String isoCode) {
this.isoCode = isoCode;
}
}
public class Address {
public Address(Country country) {
this.country = country;
}
private Country country;
/**
* 要使用空对象模式得返回 Optional<T> 的格式
**/
public Optional<Country> getCountry() {
return Optional.ofNullable(country);
}
public void setCountry(Country country) {
this.country = country;
}
}
public class User {
public User(Address address) {
this.address = address;
}
private Address address;
/**
* 要使用空对象模式得返回 Optional<T> 的格式
**/
public Optional<Address> getAddress() {
return Optional.ofNullable(address);
}
public void setAddress(Address address) {
this.address = address;
}
}
常规代码
if(null != user){
Address address = user.getAddress();
if(null != address){
Country country = user.getCountry();
if(null != country){
String isocode = country.getIsocode();
if(null != isocode){
isocode = isocode.toUpperCase();
}
}
}
}
Optional 代码
public class UseOptionalDemo {
public static void main(String[] args) {
User user = new User(new Address(null));
String code = Optional.ofNullable(user)
.flatMap(u -> u.getAddress())
.flatMap(a -> a.getCountry())
.map(c -> c.getIsocode())
.orElse("暂无").toUpperCase();
System.out.println(code);
}
}