深入理解Optional.empty

在Java 8中,Optional类引入了一个新特性。Optional类允许我们将一个变量包装起来,指示该变量是否为null。Optional在工程中被广泛使用。实际上,Optional的许多方法都有默认实现。其中,Optional.empty()是一个很有趣的方法。本文将介绍Optional.empty()的相关内容,包括它的含义,使用场景,以及它实现的细节。

一、用Optional.empty()处理Null值

1、Optional.empty.throw

我们先来看一个例子,假设有一个实体类,类名为Student。Student有两个属性:name和age。现在我们要查找一个年龄为18的学生:

public class Student {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge(){
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

public class Main {
    public static Student findStudent(){
        Student student = new Student();
        student.setName("Tom");
        return student;
    }

    public static void main(String[] args) {
        Student student = findStudent();

        if(student != null && student.getAge() != null && student.getAge() == 18){
            System.out.println(student.getName() + " is 18 years old");
        }else{
            System.out.println("No student found");
        }
    }
}

执行结果如下:

No student found

我们看到,如果找不到年龄为18岁的学生,就会输出“No student found”。现在我们来修改主函数,运用Optional.empty()方法进行null值处理:

public static Optional findStudent(){
    Student student = new Student();
    student.setName("Tom");
    return Optional.empty();
}

public static void main(String[] args) {
    Optional studentOptional = findStudent();

    if(studentOptional.isPresent()){
        Student student = studentOptional.get();
        if(student.getAge() == 18){
            System.out.println(student.getName() + " is 18 years old");
        }else{
            System.out.println("No student found");
        }
    }else{
        System.out.println("No student found");
    }
}

这段代码中,我们将findStudent()函数的返回值类型改为Optional。同时,在findStudent()函数中,我们返回了Optional.empty()。在主函数中,我们首先用if语句判断studentOptional是否存在,如果存在,再通过get()方法获取实际的Student对象。这样,即使Student对象的某个属性为null,我们也可以通过Optional.empty()进行判空处理。

2、Optional.empty.get

在上面的例子中,我们使用了Optional.empty()方法,这个方法返回的是一个空的Optional对象,它不包含任何值。代码如下:

Optional.empty();

那么,如果我们尝试从Optional.empty()对象中获取值,会发生什么呢?看下面的代码:

Optional optional = Optional.empty();
String str = optional.get();

这里,我们尝试从optional对象中获取一个String类型的值,并赋值给str。由于optional是空的,所以程序会抛出NoSuchElementException异常。因此,如果使用Optional.empty()方法创建一个空的Optional对象,就需要使用isPresent()方法来判断是否存在值。

二、使用Optional.empty()替代null

1、Optional.empty.orElse

在Java中,null值是很常见的,这也是Java编程中的一个大问题。由于null值的不可控性,经常会出现nullPointerException等运行时错误。为了解决这个问题,Optional类引入了Optional.empty()方法。有了它,我们可以先判断是否为null值,再进行下一步操作。

接下来,我们看一个使用Optional.empty().orElse()替代null的例子:

public static void main(String[] args) {
    List list = new ArrayList();
    list.add("apple");
    list.add(null);
    list.add("banana");
    list.add("orange");
    list.add(null);
    list.add("pear");

    List newList = new ArrayList();
    for(String e : list){
        Optional optional = Optional.ofNullable(e);
        if(optional.isPresent()){
            newList.add(optional.get());
        }else{
            newList.add("unknown fruit");
        }
    }
    System.out.println(newList);
}

这个例子中,我们使用了Optional.ofNullable()方法,它可以返回空(即null)或一个非空的Optional对象。然后,我们用if语句判断optional是否存在,如果存在,就将它获取到的值添加到新的集合newList中,否则添加“unknown fruit”。运行结果如下:

[apple, unknown fruit, banana, orange, unknown fruit, pear]

可以看到,null值被替换成了“unknown fruit”,代码的可读性和可维护性得到了提高。

2、Optional.empty.filter

除了使用Optional.empty()方法替代null值之外,我们还可以使用Optional.empty()方法对非null值进行一些其他的处理。这里,我们看一个使用Optional.empty().filter()方法进行判断的例子。

Optional optional = Optional.of(3);
optional.filter(e -> e > 2).ifPresent(System.out::println);

这个例子中,我们使用Optional.of()方法创建一个包含非null值的Optional对象。然后,我们使用filter()方法对其进行判断,如果其值大于2,则执行ifPresent()方法内的操作。因为3大于2,所以输出如下:

3

除了使用filter()方法,Optional还提供了map()方法,flatMap()方法等类似的方法,用于对非null值进行修改。

三、Optional.empty的缺点

虽然Optional.empty()方法已经减少了null值带来的问题,但它也有一些缺点。首先,Optional.empty()方法无法处理基本数据类型,如int、double、float等。其次,使用Optional.empty()方法会增加代码的复杂度和运行时间。所以,在实际应用中,我们需要权衡利弊,谨慎选择是否使用Optional.empty()方法。

原创文章,作者:YYIIM,如若转载,请注明出处:https://www.506064.com/n/349489.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
YYIIMYYIIM
上一篇 2025-02-15 17:10
下一篇 2025-02-15 17:10

相关推荐

  • 深入解析Vue3 defineExpose

    Vue 3在开发过程中引入了新的API `defineExpose`。在以前的版本中,我们经常使用 `$attrs` 和` $listeners` 实现父组件与子组件之间的通信,但…

    编程 2025-04-25
  • 深入理解byte转int

    一、字节与比特 在讨论byte转int之前,我们需要了解字节和比特的概念。字节是计算机存储单位的一种,通常表示8个比特(bit),即1字节=8比特。比特是计算机中最小的数据单位,是…

    编程 2025-04-25
  • 深入理解Flutter StreamBuilder

    一、什么是Flutter StreamBuilder? Flutter StreamBuilder是Flutter框架中的一个内置小部件,它可以监测数据流(Stream)中数据的变…

    编程 2025-04-25
  • 深入探讨OpenCV版本

    OpenCV是一个用于计算机视觉应用程序的开源库。它是由英特尔公司创建的,现已由Willow Garage管理。OpenCV旨在提供一个易于使用的计算机视觉和机器学习基础架构,以实…

    编程 2025-04-25
  • 深入了解scala-maven-plugin

    一、简介 Scala-maven-plugin 是一个创造和管理 Scala 项目的maven插件,它可以自动生成基本项目结构、依赖配置、Scala文件等。使用它可以使我们专注于代…

    编程 2025-04-25
  • 深入了解LaTeX的脚注(latexfootnote)

    一、基本介绍 LaTeX作为一种排版软件,具有各种各样的功能,其中脚注(footnote)是一个十分重要的功能之一。在LaTeX中,脚注是用命令latexfootnote来实现的。…

    编程 2025-04-25
  • 深入剖析MapStruct未生成实现类问题

    一、MapStruct简介 MapStruct是一个Java bean映射器,它通过注解和代码生成来在Java bean之间转换成本类代码,实现类型安全,简单而不失灵活。 作为一个…

    编程 2025-04-25
  • 深入探讨冯诺依曼原理

    一、原理概述 冯诺依曼原理,又称“存储程序控制原理”,是指计算机的程序和数据都存储在同一个存储器中,并且通过一个统一的总线来传输数据。这个原理的提出,是计算机科学发展中的重大进展,…

    编程 2025-04-25
  • 深入理解Python字符串r

    一、r字符串的基本概念 r字符串(raw字符串)是指在Python中,以字母r为前缀的字符串。r字符串中的反斜杠(\)不会被转义,而是被当作普通字符处理,这使得r字符串可以非常方便…

    编程 2025-04-25
  • 深入了解Python包

    一、包的概念 Python中一个程序就是一个模块,而一个模块可以引入另一个模块,这样就形成了包。包就是有多个模块组成的一个大模块,也可以看做是一个文件夹。包可以有效地组织代码和数据…

    编程 2025-04-25

发表回复

登录后才能评论