Java8 Optional各种应用使用

发布时间 2023-06-29 09:46:19作者: 纠结帝

首先讲一下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