Java函数式编程(六):Optional
Optional简介
在Java 8中,Optional成为了一个非常重要的新特性。Optional
Optional
Optional如何创建
首先Optional通过四种静态工厂方法创建:
- empty()
- of(T value)
- ofNullable(T value)
- supplier(Supplier<? extends T> supplier)
下面一一示例说明:
empty():返回一个空的 Optional 实例
Optional<Car> emptyOpt = Optional.empty();
of(T value):将一个非空的值放入 Optional 容器中,如果参数是 null,就报错,否则创建一个 Optional 实例
Optional<Car> opt = Optional.of(car);
ofNullable(T value):将一个非空或空的值放到 Optional 容器中,如果为空,相当于empty()方法
Optional<Car> opt = Optional.ofNullable(car);
supplier(Supplier<? extends T> supplier):如果类中存在相应类型的值,返回相应值,否则返回由supplier定义的对象
Optional<Car> opt = Optional.ofNullable(car);
Car car2 = opt.orElseGet(() -> new Car());
Optional API
接下来我们来说明一下Optional类的API,包括获取Optional中的值、判断Optional是否存在值、滤除Optional中的值等。
get() 方法:返回所包含的值,如果内部值为 null,会抛出一个NoSuchElementException 异常
// 判断Optional是否存在值,如果有值调用get方法获取值
Optional<Car> opt = Optional.ofNullable(car);
if (opt.isPresent()) {
Car car2 = opt.get();
}
上面的代码会判断Optional是否存在值,如果有值调用get方法获取值,如果内部值为null,会抛出一个NoSuchElementException 异常。
orElse(T other):如果有值则返回该值,否则返回向其传递的 other 参数
// 如果Optional为空,设置默认值
Car car2 = opt.orElse(new Car());
上面的代码会判断Optional是否存在值,如果不存在,会设置一个默认值。
orElseGet(Supplier<? extends T> supplier):如果有值则返回该值,否则返回由supplier生产的值
// 如果Optional为空,通过Supplier来创建一个对象实例
Car car2 = opt.orElseGet(() -> new Car());
上面的代码会判断Optional是否存在值,如果不存在,会通过一个Supplier来创建一个对象实例。
map(Function<? super T, ? extends U> mapper):如果有值,则对其进行调用,并返回一个 Optional 类型的结果,否则返回一个空 Optional
// 调用Optional值的map方法对值进行处理
Optional<String> name = opt.map(Car::getName);
上面的代码会调用Optional值的map方法对值进行处理。
filter:如果有值并且满足条件,则返回描述该值的 Optional;否则返回一个空的 Optional
// 调用Optional值的filter方法过滤值
Optional<Car> filtered = opt.filter((car) -> "polo".equals(car.getName()));
上面的代码会调用Optional值的filter方法过滤值。
Optional应用实例
下面我们举一个示例说明Optional在实际开发中的应用。
比如在某个购物网站,需要获取用户的某个订单的金额。如果用户的某个订单不存在,我们不想用null表示,而是返回一个Optional类型的空对象。
public Optional<Order> getOrderById(Integer userId, Long orderId) {
User user = userService.getUserById(userId);
if (user != null) {
Order order = user.getOrderById(orderId);
if (order != null) {
return Optional.of(order);
}
}
return Optional.empty();
}
上面的代码中,我们会判断用户和订单是否存在,如果存在就返回包装好的Optional对象,否则就返回一个空的Optional实例。
在使用方法的时候,我们可以调用Optional类的API方法来获取其中的值或者处理其中的内容。
Optional<Order> orderOpt = getOrderById(userId, orderId);
// 如果存在值,可以通过map来处理值,比如计算金额
BigDecimal total = orderOpt.map(Order::getTotal).orElse(BigDecimal.ZERO);
上面的代码中,我们首先通过getOrderById方法获取到一个Optional对象。在获取到这个Optional对象之后,我们可以通过map方法获取订单的金额,如果没有返回默认值0。这样我们便可以通过Optional对象更好的处理一些可能为null的情况。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java函数式编程(六):Optional - Python技术站