浅析Java中如何优雅地处理null值
假设我们有一个学生对象,以及这个学生对象的 Optional 包装器:
public class Student {
private String name;
private Integer age;
// 全参构造函数
public Student(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public Integer getAge() {
return age;
}
// toString 方法
@Override
public String toString() {
return"Student{" + "name='" + name + '\'' + ", age=" + age + '}';
}
}
public class OptionalTest {
public static void main(String[] args) {
Student student = new Student("Bob", 18);
Optional<Student> studentOpt = Optional.ofNullable(student);
}
}如果不与 Lambda 结合使用,Optional 并不能简化原本繁琐的 null 值检查。例如:
// 编写方法 1
if (student == null) {
return UNKNOWN_STUDENT;
} else {
return student;
}
// 编写方法 2
if (!studentOpt.isPresent()) {
return UNKNOWN_STUDENT;
} else {
return studentOpt.get();
}只有将 Optional 与 Lambda 结合使用,才能发挥它真正的威力!
现在,让我们对比一下 Java 8 中 Lambda + Optional 与传统 Java 在以下四种常见 null 处理场景中的差异。
场景 1:不为 null 则执行
// if 语句
if (student!= null) {
System.out.println(student);
}
// Optional
studentOpt.ifPresent(System.out::println);
场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常
// if 语句
if (student == null) {
return UNKNOWN_STUDENT; // 或抛出异常
} else {
return student;
}
// Optional
return studentOpt.orElse(UNKNOWN_STUDENT);
return studentOpt.orElseThrow(RuntimeException::new);场景 3:不为 null 则返回,为 null 则由调用方法
// if 语句
if (student == null) {
return UNKNOWN_STUDENT;
} else {
return generateWithFunction();
}
// Optional
return studentOpt.orElseGet(() -> generateWithFunction());场景 4:嵌套 null 检查
// Java 7
if (student!= null) {
String name = student.getName();
if (name!= null) {
return name;
} else {
return null;
}
} else {
return null;
}
// Java 8
return studentOpt.map(Student::getName).orElse(null);从以上四种场景可以明显看出,Optional + Lambda 让我们少写了很多 if-else 代码块。尤其是场景 4,传统的 Java 写法显得冗长且难以理解,而 Optional+Lambda 则简洁明了,清晰易懂。
总结
通过结合 Lambda 表达式和 Optional,Java 的 null 处理变得更加优雅和简洁。希望这篇文章能帮助你更好地理解和使用这些特性。
到此这篇关于浅析Java中如何优雅地处理null值的文章就介绍到这了,更多相关Java处理null值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java使用pulsar-flink-connector读取pulsar catalog元数据代码剖析
这篇文章主要介绍了Java使用pulsar-flink-connector读取pulsar catalog元数据代码剖析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-08-08
Spring探秘之如何妙用BeanPostProcessor
BeanPostProcessor也称为Bean后置处理器,它是Spring中定义的接口,在Spring容器的创建过程中会回调BeanPostProcessor中定义的两个方法,这篇文章主要给大家介绍了关于Spring探秘之如何妙用BeanPostProcessor的相关资料,需要的朋友可以参考下2022-01-01
解决Java中SimpleDateFormat线程不安全的五种方案
SimpleDateFormat 就是一个典型的线程不安全事例,本文主要介绍了解决Java中SimpleDateFormat线程不安全的五种方案,需要的朋友们下面随着小编来一起学习学习吧2021-05-05
鸿蒙PC上搭建多语言开发环境Java/Python/Go/Rust配置完全指南
对于鸿蒙开发者而言,一个正确配置的开发环境是所有后续工作的基石,下面这篇文章主要介绍了鸿蒙PC上搭建多语言开发环境Java/Python/Go/Rust配置的相关资料,需要的朋友可以参考下2026-05-05
spring boot集成smart-doc自动生成接口文档详解
这篇文章主要介绍了spring boot集成smart-doc自动生成接口文档详解,smart-doc是一款同时支持java restful api和Apache Dubbo rpc接口文档生成的工具,smart-doc颠覆了传统类似swagger这种大量采用注解侵入来生成文档的实现方法2022-09-09
Java使用FileOutputStream写Excel文件不落盘的解决方法
最近在写 Java 代码处理 Excel 文件的时候,遇到了一个挺头疼的问题:使用 Apache POI 的 XSSFWorkbook.write(FileOutputStream) 方法写文件,生成的 Excel 文件却打不开,所以本文就给大家介绍了Java使用FileOutputStream写Excel文件不落盘的解决方法2025-11-11


最新评论