本来觉得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还是得根据业务而定。