Java8之Optional

理解

Optional是Java 8的一个新特性,它是一个对象判空的处理类,其出现的目的是可以优雅的解决java.lang.NullPointException,能够避免大量的空值判断。

钻研

具体翻译如下:

这个容器可以包含或者不包含一个非空值。如果这个值存在,isPresent()方法将返回true,get()方法将返回值。

它提供了依赖于包含值的存在与否的其他方法,例如orElse()(如果值不存在,则返回默认值)和ifPresent()(如果值存在,则执行代码块)。

这是一个基于值的类;在Optional的实例上使用对标识敏感的操作(包括引用相等(=)、标识哈希码或同步)可能会产生不可预知的结果,应该避免。

 

方法

API 方法详情
of 将值封装为Optional对象,如果值为空,则抛出空指针异常 
 ofNullable 将值封装为Optional对象,如果值为空,返回一个空的 Optional对象
 get  如果Optional中有值存在,则返回此值,否则抛出NoSuchElementException
 isPresent  如果Optional中有值存在,则返回true,否则返回false 
 ifPresent  如果Optional中有值存在,则执行方法调用,否则什么也不做 
 orElse 如果Optional中有值存在,则返回此值,否则返回一个默认值 
 orElseGet 如果Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值 
 empty 创建一个空的Optional对象 
 orElseThrow 如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常 
 filter 如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象 
 map 如果创建的Optional中的值存在,对该值执行提供的Function函数调用 
 flagMap 如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象 

 

使用

以前的用法:

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("取值错误");
}

Java8用法:

public String getCity(User user) throws Exception{
   return Optional.ofNullable(user)
         .map(u-> u.getAddress())
         .map(a->a.getCity())
         .orElseThrow(()->new Exception("取指错误"));
}

以前的用法:

if(user!=null){
   dosomething(user);
}

Java8用法:

Optional.ofNullable(user).ifPresent(u->{
   dosomething(u);
});

以前的用法:

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

Java8用法:

public User getUser(User user) {
   return Optional.ofNullable(user)
         .filter(u->"zhangsan".equals(u.getName()))
         .orElseGet(()-> {
            User user1 = new User();
            user1.setName("zhangsan");
            return user1;
         });
}
posted @ 2021-07-22 15:08  passex  阅读(105)  评论(0)    收藏  举报