Java 1.8 Optional 杜绝空指针异常

更新时间 2023-07-21 10:32:04

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 50w+ 字,讲解图 2200+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1800+ 小伙伴加入学习 ,欢迎点击围观

在 Java 1.8 中,Optional 是一个用于处理可能为 null 的值的容器类。它提供了一种优雅的方式来避免空指针异常,并且可以用于优雅地处理可能为空的对象。

本教程将深入介绍 Java 1.8 中的 Optional 类,并通过示例代码演示如何使用它。

Optional 类概览

java.util 包中,Optional 类定义如下:

public final class Optional<T> {
    // 构造函数、静态工厂方法和其他方法
}

Optional 是一个泛型类,它可以包装任意类型的值。

创建 Optional 对象

你可以使用以下方法来创建 Optional 对象:

1. of() 方法

Optional<String> optionalValue = Optional.of("Hello, World!");

使用 of() 方法创建一个非空的 Optional 对象,如果传入的值为 null,则会立即抛出 NullPointerException

2. ofNullable() 方法

Optional<String> optionalValue = Optional.ofNullable(null);

使用 ofNullable() 方法创建一个 Optional 对象,如果传入的值为 null,则会创建一个空的 Optional 对象。

3. empty() 方法

Optional<String> optionalValue = Optional.empty();

使用 empty() 方法创建一个空的 Optional 对象,表示该 Optional 对象没有值。

使用 Optional 对象

Optional 提供了一系列方法来处理可能为 null 的值。

1. isPresent() 方法

Optional<String> optionalValue = Optional.of("Hello, World!");
if (optionalValue.isPresent()) {
    System.out.println("Value is present: " + optionalValue.get());
} else {
    System.out.println("Value is not present.");
}

isPresent() 方法用于判断 Optional 对象是否包含值。如果包含值,则返回 true,否则返回 false

2. ifPresent() 方法

Optional<String> optionalValue = Optional.of("Hello, World!");
optionalValue.ifPresent(value -> System.out.println("Value is present: " + value));

ifPresent() 方法用于在 Optional 对象包含值的情况下执行给定的操作。如果 Optional 包含值,则会执行 Lambda 表达式,否则不会执行任何操作。

3. orElse() 方法

Optional<String> optionalValue = Optional.empty();
String result = optionalValue.orElse("Default Value");
System.out.println("Result: " + result);

orElse() 方法用于获取 Optional 对象的值。如果 Optional 对象包含值,则返回该值,否则返回传入的默认值。

4. orElseGet() 方法

javaCopy codeOptional<String> optionalValue = Optional.empty();
String result = optionalValue.orElseGet(() -> "Default Value");
System.out.println("Result: " + result);

orElseGet() 方法与 orElse() 方法类似,但传入的参数是一个 Supplier 函数 ,可以用于生成默认值。

5. orElseThrow() 方法

Optional<String> optionalValue = Optional.empty();
String result = optionalValue.orElseThrow(() -> new IllegalArgumentException("Value not present"));
System.out.println("Result: " + result);

orElseThrow() 方法用于在 Optional 对象为空时抛出异常。如果 Optional 包含值,则返回该值,否则抛出指定的异常。

链式调用

Optional 还支持链式调用,可以在一系列操作中依次处理 Optional 对象。

Optional<String> optionalValue = Optional.of("Hello, World!");
optionalValue.map(String::toUpperCase).ifPresent(value -> System.out.println("Uppercase value: " + value));

在这个例子中,我们使用 map() 方法将值转换为大写形式,并使用 ifPresent() 方法在 Optional 对象包含值时打印大写的结果。

总结

Java 1.8 中的 Optional 类为处理可能为 null 的值提供了优雅的解决方案。通过使用 Optional,我们可以避免空指针异常,并且可以更加优雅地处理可能为空的对象。