Optional(优雅的解决空指针)


一、介绍

  • java8引入的一个很有趣的特性是Optional类,Optional 类是一个容器对象,可以包装一个对象,它的引入很好的解决空指针异常
//T:包装对象的泛型
java.util.Optional<T>

二、构建

  • Optional的构造方法是私有的,无法通过new来创建,但是它提供了一些静态方法来构建
//1、构建一个空容器
Optional<T> Optional.empty();

//2、通过包装对象构建,value == null ? empty() : of(value)
Optional<T> ofNullable(T value);

//3、包装的对象=null会NullPointException
Optional<T> of(T value);

三、API

1、包装的对象是否为null

//!=null - true
boolean isPresent();

2、返回包装对象

//包装对象=null会抛出异常
T get();

//包装对象=null时返回other,否则返回包装对象
T orElse(T other);

//和orElse相似,不同的是包装的对象=null时,返回重写get方法返回值
T orElseGet(Supplier<T> other);

//包装对象=null时,抛出一个错误/异常,否则返回包装对象
Throwable T orElseThrow(Supplier<X> exceptionSupplier);
o1.orElseThrow(()->new RuntimeException());

3、包装的对象不为null进行的操作,否则不做任何操作

void ifPresent(Consumer<? super T> consumer);

//包装对象不为null时,添加到pageList
.ifPresent(pageList::add);	

4、过滤包装对象

//包装对象=null或者包装对象不匹配,则返回new Optional<>(),否则返回该Optional
Optional<T> filter(Predicate<? super T> predicate)

5、包装对象数据转换

//包装对象=null时 返回 new Optional<>()
Optional<U> map(Function<U> mapper);

//包装对象=null时 返回 new Optional<>()
Optional<U> flatMap(Function<? super T, Optional<U>> mapper);

四、例子

1、获取嵌套的对象的属性值

//使用前
String city="";
if(user!=null){
    
    
    if(user.getAddress()!=null){
    
    
        Address address = user.getAddress();
        if(address.getCity()!=null){
    
    
            return address.getCity();
        }
    }
}

//使用后
String city=Optional.ofNullable(user)
    .map(u-> u.getAddress())
    .map(a->a.getCity())
    .orElse("");

2、值不为null进行的操作

LinkedList<User> list=new LinkedList<>();

//使用前
if(user!=null){
    
    
    list.addLast(user);
}

//使用后
Optional.ofNullable(user)
    .ifPresent(u->{
    
    
        list.addLast(u);
    });

3、必须返回一个固定的对象

//使用前
if(user!=null){
    
    
    String name = user.getName();
    if("zhangsan".equals(name)){
    
    
        return user;
    }
}else{
    
    
    user = new User();
    user.setName("zhangsan");
    return user;
}

//使用后
Optional.ofNullable(user)
    .filter(u->"zhangsan".equals(u.getName()))
    .orElseGet(()->
        new User().setName("zhangsan")
    );

4、!=null则拆分成集合,否则返回null

Set<Long> removeIds=Optional.ofNullable("1,2,3")
    .map(i->
        Pattern.compile(",")
            .splitAsStream(i)
            .map(Long::valueOf)
            .collect(Collectors.toSet())
    )
    .orElse(null);

猜你喜欢

转载自blog.csdn.net/weixin_43476020/article/details/129972064