Optional的map操作也是进行类型转换的,和Labmda的stream的map()方法功能是一样的。
区别在于,如果Optional包含一个值,那函数就将该值作为参数传递给map,对该值进行转换。如果Optional为空,就什么也不做,这就是为什么前面我们说到Optional能消除空指针的原因。
看map方法的demo:
@Data
public class OptPerson {
private String name;
private Optional<OptCar> optCar;
}
@Data
public class OptCar {
private String carName;
private OptCarBrand optCarBrand;
}
import java.util.Optional;
public class OptMapAndFlatMap {
public static void main(String[] args) {
OptPerson optPerson = new OptPerson();
optPerson.setName("IT之美");
optPerson.setOptCar(Optional.empty());
System.out.println(optPerson.getOptCar().map(OptCar::getCarName));
//输出:Optional.empty
OptCar optCar = new OptCar();
optCar.setCarName("奔驰");
Optional<OptCar> optCar2 = Optional.of(optCar);
optPerson.setOptCar(optCar2);
Optional<String> s2 = optPerson.getOptCar().map(OptCar::getCarName);
System.out.println(s2);
//输出:Optional[奔驰]
}
}
其实map方法也并不复杂,方法中也是调用了Optional中的isPresent方法来判断对象是否为空,为空就直接返回空了,不为空则继续执行,看源码:
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));
}
}