JDK8中Optional对象使用的空对象模式

58 阅读1分钟

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);  
    }  
}