一、介绍
java8引入的一个很有趣的特性是Optional类,Optional 类是一个容器对象,可以包装一个对象,它的引入很好的解决空指针异常
java. util. Optional< T >
二、构建
Optional
的构造方法是私有的,无法通过new来创建,但是它提供了一些静态方法来构建
Optional < T > Optional . empty ( ) ;
Optional < T > ofNullable ( T value) ;
Optional < T > of ( T value) ;
三、API
1、包装的对象是否为null
boolean isPresent ( ) ;
2、返回包装对象
T get ( ) ;
T orElse ( T other) ;
T orElseGet ( Supplier < T > other) ;
Throwable T orElseThrow ( Supplier < X > exceptionSupplier) ;
o1. orElseThrow ( ( ) -> new RuntimeException ( ) ) ;
3、包装的对象不为null进行的操作,否则不做任何操作
void ifPresent ( Consumer < ? super T > consumer) ;
. ifPresent ( pageList:: add ) ;
4、过滤包装对象
Optional < T > filter ( Predicate < ? super T > predicate)
5、包装对象数据转换
Optional < U > map ( Function < U > mapper) ;
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 ) ;