本来觉得Optional用法比较单调,可以使用if,else替换,还方便其他人理解,不过实际上手后发现真香。
简单来说,Optional的主要业务场景就是在对象可能为null,应用场景之一是在A,B值其中一个值为null时选择另外一个值。学习本章建议先了解java的lamda表达式。
比如现在有个Student对象,需要使用Student的name字段构造user对象,那么一般的写法就是
public User xxxFunction(Student student){
User user = new User();
if(student!=null){
user.setUsername(student.getName());
}
return user;
}
使用Optional的写法
public User xxxFunction(Student student){
User user = new User();
Optional.ofNullable(student).ifPresent(a->user.setUsername(a.getName()));
return user;
}
简单说明下上述用到Optional的方法。
ofNullable(T value)会构造返回一个Optional<T>的对象,该方法允许value为null时,Optional类封装的value值为null。
ifPresent(Consumer<? super T> consumer) ,它接受一个有入参但无返回值的函数,此时该函数的入参对象即Optional中封装的value值。查看ifPresent源码可知,如下:
public void ifPresent(Consumer<? super T> consumer) {
if (value != null)
consumer.accept(value);
}
从上述可以知道,只有当value不为null时,才执行ifPresent里面的函数。那么上述Optional的操作就可以解释通了,如果student不为null,设置user的名称为student的name值。
如果需要给user在student为null时抛出异常,通常如下
public User xxxFunction(Student student){
User user = new User();
if(student==null) {
//可以为其他用户封装的异常类
throw new NullPointerException("student不允许为空");
}
user.setUserName(student.getName());
return user;
}
Optional写法
public User xxxFunction(Student student){
User user = new User();
user.setUserName(Optional.ofNullable(student).orElseThrow(()->new NullPointerException("student类不能为空")).getName());
return user;
}
在实际的业务中,我觉得Optional实际的作用场景,对于某两个值二选一的时候就很适合,比如如下
还是拿User的username举例,如果A有值,取A,A没值取B。
public void say(String A,String B){
User user = new User();
user .setUserName(Optional.ofNullable(A).orElse(B));
}
如果在途中需要对A,B进行操作,比如加密等,可如下(这里拿字符串拼接举例)
public void say(String A,String B){
User user = new User();
user.setUserName(Optional.ofNullable(A).map(a->a+"end").orElseGet(()->B+"end"));
}
此处需要注意map的用法,map会遍历Optional的value,此处只有个A的String类型对象,会返回该A对象,然后我在此拼接字符串,特别注意,如果A为null,此处不会进行map里面的操作。理由是查看map源码可知
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
关于Optional的介绍就到此,Optional的方法大致都介绍的差不多了,其实Otional就跟大多数lamda表达式一样,在某些程度上简化了代码,但是会提高一点代码的学习成本,实际上是否使用Optional还是得根据业务而定。