返回顶部
分享到

Java中怎么优雅地处理null值

java 来源:互联网 作者:佚名 发布时间:2025-04-16 20:09:39 人浏览
摘要

假设我们有一个学生对象,以及这个学生对象的 Optional 包装器: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class Student { private String name; private Integer age; // 全参构造函数 public Student(St

假设我们有一个学生对象,以及这个学生对象的 Optional 包装器:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

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 + '}';

    }

}

1

2

3

4

5

6

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

2

3

4

5

6

7

8

9

10

11

12

// 编写方法 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 则执行

1

2

3

4

5

6

// if 语句

if (student!= null) {

    System.out.println(student);

}

// Optional

studentOpt.ifPresent(System.out::println);

场景 2:不为 null 则返回,为 null 则返回特定值或抛出异常

1

2

3

4

5

6

7

8

9

// if 语句

if (student == null) {

    return UNKNOWN_STUDENT; // 或抛出异常

} else {

    return student;

}

// Optional

return studentOpt.orElse(UNKNOWN_STUDENT);

return studentOpt.orElseThrow(RuntimeException::new);

场景 3:不为 null 则返回,为 null 则由调用方法

1

2

3

4

5

6

7

8

// if 语句

if (student == null) {

    return UNKNOWN_STUDENT;

} else {

    return generateWithFunction();

}

// Optional

return studentOpt.orElseGet(() -> generateWithFunction());

场景 4:嵌套 null 检查

1

2

3

4

5

6

7

8

9

10

11

12

13

// 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 处理变得更加优雅和简洁。希望这篇文章能帮助你更好地理解和使用这些特性。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Java中怎么优雅地处理null值
    假设我们有一个学生对象,以及这个学生对象的 Optional 包装器: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 public class Student { private Stri
  • SpringBoot实现数据库读写分离的3种方法
    一、数据库读写分离概述 在大型应用系统中,随着访问量的增加,数据库常常成为系统的性能瓶颈。为了提高系统的读写性能和可用性,读
  • SpringBoot启动报错的11个高频问题排查与解决终极
    1. 依赖冲突:NoSuchMethodError 的终极解法 错误现象: java.lang.NoSuchMethodError: org.springframework.core.annotation.AnnotationUtils.isAnnotationInherited 原因分析
  • SpringBoot2.6.x与Swagger3兼容问题及解决方法
    报错: Failed to start bean documentationPluginsBootstrapper; nested exception is java.lang.NullPointerException 解决: ? 如果项目中未引入spring-boot-starter-actuator,
  • Java使用多线程处理未知任务数
    知道任务个数,你可以定义好线程数规则,生成线程数去跑 代码说明: 1.虚拟线程池: 使用 Executors.newVirtualThreadPerTaskExecutor() 创建虚拟线程
  • Java高级-反射&动态代理介绍
    1. 反射 1.1 反射的概述 专业的解释(了解一下): 是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法; 对于任意一个
  • 使用EasyPoi实现多Sheet页导出的代码
    因多次遇到导出多Sheet页的需求,故记录下来,以备后续参考使用 一、Pom依赖 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 !-- 集成easypoi组件 .导出excel ht
  • idea导入若依项目教程

    idea导入若依项目教程
    IDEA导入若依管理系统 项目官网地址:https://gitee.com/y_project/RuoYi-Vue 前提 系统需求: JDK = 1.8 MySQL = 5.5 Maven = 3.0 redis 必须启动(可以下载一个
  • Java中实现订单超时自动取消功能(最新推荐)

    Java中实现订单超时自动取消功能(最新推荐)
    在开发中,我们会遇到需要延时任务的业务场景,例如:用户下单之后未在规定的时间内支付成功,该订单会自动取消; 用户注册成功15分
  • 阿里巴巴TransmittableThreadLocal使用介绍
    ThreadLocal在上下文的数据传输上非常的方便和简洁。 工业实践中,比较常用的有三个,ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal,那
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计