您的位置:

深入理解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()方法。