在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 OptionalfindStudent(){ 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
2、Optional.empty.get
在上面的例子中,我们使用了Optional.empty()方法,这个方法返回的是一个空的Optional对象,它不包含任何值。代码如下:
Optional.empty();
那么,如果我们尝试从Optional.empty()对象中获取值,会发生什么呢?看下面的代码:
Optionaloptional = 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) { Listlist = 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()方法进行判断的例子。
Optionaloptional = 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()方法。