Java的Optional类——解决空指针异常的好工具

2024-08-21 18:36

本文主要是介绍Java的Optional类——解决空指针异常的好工具,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

java.util.Optional 类是 Java 8 引入的一个容器对象,旨在解决空指针异常的问题。Optional 类提供了一种优雅的方式来处理可能为 null 的值,从而避免了显式的 null 检查。这对于提高代码的可读性和减少空指针异常非常有用。

Optional 类的基本用法

  1. 构造:不能直接使用 new Optional() 创建 Optional 对象,因为它的构造器是私有的。可以通过 Optional.of(T)Optional.ofNullable(T)Optional.empty() 方法来创建 Optional 对象。

    • Optional.of(T t):如果 t 不为 null,则创建一个包含 tOptional 对象;否则抛出 NullPointerException
    • Optional.ofNullable(T t):如果 t 不为 null,则创建一个包含 tOptional 对象;否则创建一个空的 Optional 对象。
    • Optional.empty():创建一个空的 Optional 对象。
  2. 判断是否为空:可以使用 Optional.isPresent() 方法来判断 Optional 对象是否包含非空值。

  3. 获取值:可以通过多种方式获取 Optional 包含的值:

    • Optional.get():如果 Optional 包含非空值,则返回该值;否则抛出 NoSuchElementException
    • Optional.orElse(T other):如果 Optional 包含非空值,则返回该值;否则返回提供的默认值 other
    • Optional.orElseGet(Supplier<T> other):如果 Optional 包含非空值,则返回该值;否则调用 Supplier 获取一个默认值。
    • Optional.orElseThrow(Supplier<? extends X> exceptionSupplier):如果 Optional 包含非空值,则返回该值;否则抛出由 exceptionSupplier 提供的异常。
  4. 转换:可以使用 Optional.map(Function<T, R> mapper)Optional.flatMap(Function<T, Optional<R>> mapper) 方法来转换 Optional 内部的值。

  5. 组合操作:可以使用 Optional.filter(Predicate<T> predicate) 方法来过滤 Optional 内部的值,还可以使用 Optional.ifPresent(Consumer<T> action) 方法来执行某些操作。

示例代码

下面是一些使用 Optional 的示例代码。

创建 Optional
String name = "John Doe";
Optional<String> optionalName = Optional.of(name); // 不会为 null
Optional<String> optionalNameOrNull = Optional.ofNullable(null); // 可以为 null
Optional<String> emptyOptional = Optional.empty(); // 空的 Optional
判断是否为空
if (optionalName.isPresent()) {System.out.println("Optional is present.");
} else {System.out.println("Optional is empty.");
}
获取值
// 如果 Optional 包含非空值则获取它,否则抛出 NoSuchElementException
String nameValue = optionalName.get();// 如果 Optional 包含非空值则获取它,否则返回默认值 "Unknown"
String defaultName = optionalName.orElse("Unknown");// 如果 Optional 包含非空值则获取它,否则调用 Supplier 获取默认值
String defaultNameFromSupplier = optionalName.orElseGet(() -> "Unknown");// 如果 Optional 包含非空值则获取它,否则抛出 IllegalArgumentException
String nameOrThrow = optionalName.orElseThrow(IllegalArgumentException::new);
转换值

假设我们有一个 Person 类,它有一个 getName 方法。

class Person {private String name;public Person(String name) {this.name = name;}public String getName() {return name;}
}Person person = new Person("Jane Smith");
Optional<Person> optionalPerson = Optional.of(person);// 转换 Person 为 String
Optional<String> personName = optionalPerson.map(Person::getName);
personName.ifPresent(System.out::println); // 输出 "Jane Smith"// 使用 flatMap 进行更复杂的转换
Optional<String> lastName = optionalPerson.flatMap(p -> Optional.of(p.getName().split(" "))).flatMap(Arrays::stream).findFirst();
lastName.ifPresent(System.out::println); // 输出 "Smith"
组合操作
// 过滤操作
Optional<String> filteredName = optionalName.filter(n -> n.startsWith("J"));
filteredName.ifPresent(System.out::println); // 输出 "John Doe"// 执行操作
optionalName.ifPresent(System.out::println); // 输出 "John Doe"

完整示例

下面是一个完整的示例程序,它展示了如何使用 Optional 类来处理可能为 null 的值。

import java.util.Optional;public class OptionalExample {public static void main(String[] args) {String name = "John Doe";Optional<String> optionalName = Optional.of(name);Optional<String> optionalNameOrNull = Optional.ofNullable(null);// 判断是否为空System.out.println(optionalName.isPresent()); // 输出 trueSystem.out.println(optionalNameOrNull.isPresent()); // 输出 false// 获取值System.out.println(optionalName.get()); // 输出 "John Doe"System.out.println(optionalNameOrNull.orElse("Default Name")); // 输出 "Default Name"// 转换值Optional<String> upperCaseName = optionalName.map(String::toUpperCase);upperCaseName.ifPresent(System.out::println); // 输出 "JOHN DOE"// 组合操作optionalName.filter(s -> s.startsWith("J")).ifPresent(System.out::println); // 输出 "John Doe"}
}

这篇关于Java的Optional类——解决空指针异常的好工具的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093954

相关文章

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

SpringBoot中@Value注入静态变量方式

《SpringBoot中@Value注入静态变量方式》SpringBoot中静态变量无法直接用@Value注入,需通过setter方法,@Value(${})从属性文件获取值,@Value(#{})用... 目录项目场景解决方案注解说明1、@Value("${}")使用示例2、@Value("#{}"php

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

C++右移运算符的一个小坑及解决

《C++右移运算符的一个小坑及解决》文章指出右移运算符处理负数时左侧补1导致死循环,与除法行为不同,强调需注意补码机制以正确统计二进制1的个数... 目录我遇到了这么一个www.chinasem.cn函数由此可以看到也很好理解总结我遇到了这么一个函数template<typename T>unsigned

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。