首先讲一下Optional主要解决我们日常空指针NullPointerException问题
方法 |
描述 |
get |
如果这个Optional中存在一个值,则返回该值,否则抛出NoSuchElementException。 |
of |
返回具有指定当前非空值的可选对象,如果值为空,则抛出NoSuchElementException。 |
ofNullable |
返回描述指定值的Optional,如果非空,则返回空Optional。 |
isPresent |
如果存在值则返回true,否则返回false。 |
filter |
如果存在一个值,并且该值与给定的谓词匹配,则返回描述该值的Optional,否则返回空Optional。 |
map |
如果存在值,则对其应用所提供的映射函数,如果结果非空,则返回描述结果的Optional。否则返回一个空的Optional。 |
flatMap |
如果存在值,则对其应用所提供的与Optional相关的映射函数,返回该结果,否则返回空的Optional。这个方法类似于map(Function),但是所提供的映射器的结果已经是一个Optional,并且如果调用,flatMap不会用额外的Optional来包装它。 |
orElse |
如果存在则返回值,否则返回other。 |
orElseThrow |
返回包含的值(如果存在),否则抛出由提供的提供程序创建的异常。 |
实战使用
Optional.of: 依据一个非空值创建一个optional对象,userAccountVo是空会抛空指针异常,NullPointerException
UserAccountVo userAccountVo=new UserAccountVo(); Optional.of(userAccountVo);
Optional.ofNullable: 可接受为空的数据
map 主要通过映射的方法进行获取Optional,如果为空返回一个空的Optional
get():如果变量存在就返回,否则抛出nosuchelementexception
UserAccountVo userAccountVo=new UserAccountVo(); userAccountVo.setId(1L); Optional.ofNullable(userAccountVo).map(UserAccountVo::getUserName).get();
orElse:如果为空,就设置一个默认值
UserAccountVo userAccountVo=new UserAccountVo(); Optional.ofNullable(userAccountVo).map(UserAccountVo::getUserName).orElse("张三");
isPresent():判断optional是否为空,如果空则返回false,否则返回true
ifPresent(Consumer c):如果optional不为空,则将optional中的对象传给Comsumer函数
Optional.ofNullable(userAccountVo).ifPresent(u -> System.out.println("The userAccountVo name is : " + u.getUserName()));
filter(Predicate<T> p):如果optional不为空,则执行断言函数p,如果p的结果为true,则返回原本的optional,否则返回空的optional
Optional.ofNullable(userAccountVo).filter( u -> u.getUserName().equals("张三")).ifPresent(u -> System.out.println("His name is Zhang SAN"));
map(Function<T, U> mapper):如果optional不为空,则将optional中的对象 t 映射成另外一个对象 u,并将 u 存放到一个新的optional容器中。
Optional.ofNullable(userAccountVo).map(u -> u.getUserName());
flatMap(Function< T,Optional<U>> mapper):跟上面一样,在optional不为空的情况下,将对象t映射成另外一个optional
Optional.ofNullable(userAccountVo).flatMap(u -> Optional.ofNullable(u.getUserName()));
区别:map会自动将u放到optional中,而flatMap则需要手动给u创建一个optional