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


目录
相关文章
|
4天前
|
Java Unix 程序员
java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解
java 8 新特性讲解Optional类--Fork/Join 框架--新时间日期API--以及接口的新特性和注解
65 1
|
7月前
|
Java 程序员 API
Java8特性第三讲:如何使用Optional类优雅解决业务npe问题
Java8特性第三讲:如何使用Optional类优雅解决业务npe问题
|
1天前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
24 7
|
4天前
|
安全 Java 开发者
Java一分钟之-Optional类:优雅处理null值
【5月更文挑战第13天】Java 8的`Optional`类旨在减少`NullPointerException`,提供优雅的空值处理。本文介绍`Optional`的基本用法、创建、常见操作,以及如何避免错误,如直接调用`get()`、误用`if (optional != null)`检查和过度使用`Optional`。正确使用`Optional`能提高代码可读性和健壮性,建议结合实际场景灵活应用。
21 3
|
4天前
|
Java 编译器 API
Java基础教程(17)-Java8中的lambda表达式和Stream、Optional
【4月更文挑战第17天】Lambda表达式是Java 8引入的函数式编程特性,允许函数作为参数或返回值。它有简洁的语法:`(parameters) -> expression 或 (parameters) ->{ statements; }`。FunctionalInterface注解用于标记单方法接口,可以用Lambda替换。
|
4天前
|
存储 Java API
java8新特性 lambda表达式、Stream、Optional
java8新特性 lambda表达式、Stream、Optional
|
4天前
|
Java
Java8 Optional
Java8 Optional
12 0
|
4天前
|
安全 Java 开发者
Java 8 `Optional` 类的用法和优势
【2月更文挑战第15天】
15 0
|
4天前
|
存储 Java
java8新特性-Optional
java8新特性-Optional
21 0
|
4天前
|
JSON 安全 Java
JAVA8实战 - Optional工具类
JAVA8实战 - Optional工具类
85 0