Optional的简单介绍
功能: 减少null值的判断逻辑: 变量存在时,Optional类只对类进行简单的封装;不存在时,缺失的值会被建模成一个"空"的Optional对象,由方法Optional.empty()返回
Optional声明
//定义一个entity @Data //lombok里的注解,包含@Getter,@Setter public class Car { private int id; private String name; private String createDate; private double price; } //1.声明一个空的Optional对象 Optional<Car> optCar = Optional.empty(); //2.依据一个非空值创建Optional Car car = new Car(); car.setCreateDate("2019-03-27 12:12:12"); car.setPrice(188888.88); Optional<Car> optCar = Optional.of(car); //3.声明一个可以接受null的Optional(可允许空值,创建空对象) Car car = new Car(); Optional<Car> optCar = Optional.ofNullable(car);
Optional常用的方法
// 1.map()方法--映射 Optional<Car> optCar = Optional.ofNullable(car); Optional<String> optStr = optCar.map(Car :: getCreateDate);
2.flatMap()方法--简化一个对象的多个成员变量的非空判断
car.getId().getPrice().getPrice(); //2.1 Optional的判断使用方法 Optional<Car> optCar = Optional.of(car); optCar.flatMap(Car :: getName).flatMap(Car :: getPrice).flatMap(Car :: getCreateDate).orElse("unKnown"); //2.2 对象中包含有对象的使用方法 Optional<Car> optCar = Optional.of(car); optCar.flatMap(Car :: Engine).map(Engine :: getName).orElse("unKnown");
3.Optional的获取值的方法汇总
//3.1 get()方法,若存在则返回封装的变量值,否则抛出NoSuchElementException Car carNew = optCar.get(); //3.2 orElse()方法,之前有用过,对象不包含时提供一个默认值 optCar.flatMap(Car :: Engine).map(Engine :: getName).orElse("unKnown"); //3.3 orElseGet(Supplier<? extends X> ex)和orElse的延迟调用Supplier,只有在Optional对象不含值时调用 Car carNew = optCar.orElseGet(()->null); //单独使用是返回封装的类型,当其中的属性不存在时以null作为填充 String name = optCar.map(Car :: getName).orElseGet(()->null); //返回的是map映射后的对象 //3.4 orElseThrow(Supplier<? extends X> ex)和get()方法类似,为空时,可以抛出定制的异常 Car car1 = optCar.orElseThrow(()->new RunTimeException()); //3.5 ifPresent(Consumer<? super T> ex)变量存在时执行一个参数传入方法,否则不进行任何操作 optCar.ifPresent(car2->System.out.println(car2.getName())); //3.6 isPresent()方法,判断是否有值 boolean flag = optCar.isPresent();
4.filter()方法,过滤
optCar.filter(value->value.getPrice>1000000); //不是则返回一个空的Optional对象 trueOptional.empty,反之是trueOptional[Car{...}]