Java 8 Optional的正确姿势

简介: Java 8 Optional的正确姿势

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{...}]


目录
相关文章
|
5月前
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional
告别NullPointerException:拥抱Java Optional
|
4月前
|
安全 Java 容器
告别繁琐判空:Optional让你的Java代码更优雅
告别繁琐判空:Optional让你的Java代码更优雅
|
4月前
|
安全 Java 容器
告别空指针噩梦:Optional让Java代码更优雅
告别空指针噩梦:Optional让Java代码更优雅
440 94
|
4月前
|
安全 Java 开发者
告别NullPointerException:掌握Java Optional的精髓
告别NullPointerException:掌握Java Optional的精髓
|
7月前
|
存储 人工智能 Java
Java 8 的 Optional:提高代码安全性与可读性
本文深入解析 Java 中的 `NullPointerException` 及其传统处理方式,并介绍了 Java 8 引入的 `Optional` 类。通过示例代码讲解了 `Optional` 的创建、使用及其 API,探讨了其在实际开发中的最佳实践与局限性,帮助开发者提升代码的健壮性与可读性。
126 0
Java 8 的 Optional:提高代码安全性与可读性
|
安全 Java API
告别繁琐编码,拥抱Java 8新特性:Stream API与Optional类助你高效编程,成就卓越开发者!
【8月更文挑战第29天】Java 8为开发者引入了多项新特性,其中Stream API和Optional类尤其值得关注。Stream API对集合操作进行了高级抽象,支持声明式的数据处理,避免了显式循环代码的编写;而Optional类则作为非空值的容器,有效减少了空指针异常的风险。通过几个实战示例,我们展示了如何利用Stream API进行过滤与转换操作,以及如何借助Optional类安全地处理可能为null的数据,从而使代码更加简洁和健壮。
464 0
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
373 7
|
10月前
|
存储 Java API
Java Optional 完全指南:彻底告别 NullPointerException
Java 8 引入的 `Optional` 类旨在解决 `null` 带来的空指针异常问题,通过提供容器类显式处理可能为空的值,提升代码健壮性和可读性。本文从基础到进阶解析 `Optional` 的用法,涵盖创建、检查、获取值、处理值等核心功能,结合实际应用场景与最佳实践,助你彻底告别 `NullPointerException`,编写更优雅的 Java 代码。
575 0
|
设计模式 Java
结合HashMap与Java 8的Function和Optional消除ifelse判断
`shigen`是一位致力于记录成长、分享认知和留住感动的博客作者。本文通过具体代码示例探讨了如何优化业务代码中的if-else结构。首先展示了一个典型的if-else处理方法,并指出其弊端;然后引入了策略模式和工厂方法等优化方案,最终利用Java 8的Function和Optional特性简化代码。此外,还提到了其他几种消除if-else的方法,如switch-case、枚举行、SpringBoot的IOC等。一起跟随shigen的脚步,让每一天都有所不同!
174 10
结合HashMap与Java 8的Function和Optional消除ifelse判断
|
安全 Java API
Java 8 流库的魔法革命:Filter、Map、FlatMap 和 Optional 如何颠覆编程世界!
【8月更文挑战第29天】Java 8 的 Stream API 通过 Filter、Map、FlatMap 和 Optional 等操作,提供了高效、简洁的数据集合处理方式。Filter 用于筛选符合条件的元素;Map 对元素进行转换;FlatMap 将多个流扁平化合并;Optional 安全处理空值。这些操作结合使用,能够显著提升代码的可读性和简洁性,使数据处理更为高效和便捷。
582 0