Optional 使用
- Optional 类是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象。
- Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
- Optional 类的引入很好的解决空指针异常。
创建
//参数:value –要描述的值,必须为非null
Optional<Object> o = Optional.of(null);
//参数:value –可以为空 也可以不空 返回传入值得optional
Optional<String> s = Optional.ofNullable("");
//返回一个空的Optional实例。 此Optional没有值。
Optional<Object> empty = Optional.empty();
判断
Optional<MyUser> myUser1 = Optional.empty();
Optional<MyUser> myUser2 = Optional.of(new MyUser("阿飞", "123456"));
// filter传入一个lambda,lambda返回值为boolean;true:不做任何改变,false:返回一个空的optional;
Optional<MyUser> myUser3 = myUser2.filter(user -> "错误的密码".equals(user.getUsername()));
// isPresent就是判断value是不是null;我们在调用get之前,一定要先调用isPresent,因为直接如果value是null,直接调用get会报异常;
if (myUser1.isPresent()) {
MyUser value = myUser1.get();
System.out.println("optional value:" + value);
} else {
System.out.println("optional value==null");
}
// ifPresent传入一段lambda,当value!=null时,执行里面的逻辑;当当value==null时,啥都不干;
myUser2.ifPresent(value -> System.out.println("optional value:" + value));
System.out.println(myUser3);
// 输入如下:
//optional value==null
//optional value:MyUser{id='阿飞', username='123456'}
//Optional.empty
获取
Optional<MyUser> userInfoEmptyOpt = Optional.empty();
Optional<MyUser> userInfoOpt = Optional.of(new MyUser("阿飞","123456"));
// 1、直接获取,注意如果value==null,会报NoSuchElementException异常
MyUser userInfo1 = userInfoOpt.get();
// 2、orElse可以传入一个UserInfo类型的对象作为默认值;
// 当value!=null时,返回value值;当value==null时,返回默认值作为代替;
MyUser userInfo2 = userInfoEmptyOpt.orElse(new MyUser("阿飞1","123456"));
// 3、orElseGet和orElse不同的是orElseGet可以传入一段lambda表达式;
// 当value!=null时,返回value值;
// 当value==null时,使用该lambda返回的对象作为默认值;
MyUser userInfo3 = userInfoEmptyOpt.orElseGet(() -> new MyUser("阿飞2","123456"));
// 4、orElseThrow可以传入一段lambda表达式,lambda返回一个Exception;当value!=null时,返回value值;当value==null时,抛出该异常;
MyUser userInfo4 = userInfoOpt.orElseThrow(NullPointerException::new);
System.out.println(userInfo1);
System.out.println(userInfo2);
System.out.println(userInfo3);
System.out.println(userInfo4);
// 输出如下:
// UserInfo(username=阿飞, password=123456)
// UserInfo(username=阿飞1, password=123456)
// UserInfo(username=阿飞2, password=123456)
// UserInfo(username=阿飞, password=123456)
转换类
Optional<MyUser> userInfoOpt = Optional.of(new MyUser("阿飞","123456"));
// 原来value的类型是UserInfo,经过map转换为Optional<String>
Optional<String> username = userInfoOpt.map(MyUser::getId);
// 当map的入参也是一个Optional时,经过map转化后会形成Optional<Optional<String>>这种嵌套结构;但flatMap可以把这种嵌套结构打平;
Optional<Optional<String>> unFlatMap = userInfoOpt.map(user -> Optional.of(user.getId()));
Optional<String> flatMap = userInfoOpt.flatMap(user -> Optional.of(user.getId()));
System.out.println(username);
System.out.println(unFlatMap);
System.out.println(flatMap);
// 输出如下:
// Optional[阿飞]
// Optional[Optional[阿飞]]
// Optional[阿飞]
方法 | 描述 |
---|---|
empty | 返回一个空的Optional实例 |
of | 将指定用Optional封装之后返回,如果该值为null,则抛出一个NullPointerException异常 |
ofNullable | 将指定值用Optional封装之后返回,如果该值为null,则返回一个空的Optional对象 |
filter | 如果值存在并且满足提供的谓词,就返回包含该值的Optional对象;否则返回一个空的Optional对象 |
flatMap | 如果值存在,就对该值执行提供的mapping函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象 |
map | 如果值存在,就对该值执行提供的mapping函数调用 |
isPresent | 如果值存在就返回true,否则返回false |
ifPresent | 如果值存在,就执行使用该值的方法调用,否则什么也不做 |
get | 如果值存在,就将被Optional封装的值返回,否则抛出一个NoSuchElementException异常 |
orElse | 如果有值则将其返回,否则返回一个默认值 |
orElseGet | 如果有值则将其返回,否则返回一个由指定的Supplier接口生成的值 |
orElseThrow | 如果有值则将其返回,否则抛出一个由指定的Supplier接口生成的异常 |