您的位置:

Java8中的Optional类型

Introduction

在Java 8之前,如果我们需要在代码中表示一个值可能为空的情况,我们唯一能做的就是将它设置为null。然而,这种方式是非常容易出bug的。在Null指针异常(NullPointerException)的问题中,Java 语言有一个了不起的产物叫 Optional.

正文

Optional的概念

Java 8引入了一个Optional类,建议使用 Optional 类来表示一个值存在或不存在。这个对象可以包含非空的对象(存在),或者NULL(不存在)。使用 Optional 的目的不是去除 null,而是提供了一种可变空值类型,使得程序员可以更加注意程序中可能会出现的 null值,这有助于减少NullpointerException的发生。

什么是Optional?

Optional是一个简单的容器类,它可以代表一个值存在或不存在,而不是使用null值来表示“没有值”这种情况。这样可以避免大量的if(foo!=null)这样的代码,并且在某种程度上提高了代码的可读性。Java 8的这个特性已经被其它很多语言借鉴了。

Optional的运用

我们可以通过下面的方式创建 Optional 对象:

Optional
    optional = Optional.of("Hello World");
   

或者我们要在一个方法中返回一个对象时,我们可以这样写:

public Optional
    getCustomObject() {
    if(condition == true) {
        return Optional.of(new CustomObject());
    } else {
        return Optional.empty();
    }
}
   

该方法可以避免返回值为null这种情况,并且可以在返回时立即知道返回值是否存在。

Optional的API

在 Optional 类中,包含很多有用的方法,这里我们只介绍其中一些。

isPresent() 和 get()

isPresent(): 如果值存在返回true,否则返回false。

get(): 如果Optional有值则将其返回,否则抛出NoSuchElementException。

Optional
    optional = Optional.of("Hello World");

if(optional.isPresent()) {
    System.out.println(optional.get()); // 输出: Hello World
}
   

orElse()

如果有值则将其返回,否则返回一个默认值。

Optional
    optional = Optional.empty();

System.out.println(optional.orElse("Hello World")); // 输出: Hello World
   

orElseGet()

orElseGet()方法与orElse()方法非常相似,但其中一个区别是提供用于计算默认值的Supplier。

Optional
    optional = Optional.empty();

Supplier
     supplier = () -> "Hello World";

System.out.println(optional.orElseGet(supplier)); // 输出: Hello World
    
   

orElseThrow()

orElseThrow() 方法与orElse() 方法和 orElseGet() 方法类似,但是抛出的是传入的异常类型。

Optional
    optional = Optional.empty();

try {
    System.out.println(optional.orElseThrow(Exception::new)); // 抛出异常: Exception
} catch (Exception e) {
    e.printStackTrace();
}
   

map()

如果有值,则对其执行调用mapping函数得到返回值。否则返回 Optional.empty()。

Optional
    optional = Optional.of("Hello World");

Optional
     upperOptional = optional.map(String::toUpperCase);

System.out.println(upperOptional.get()); // 输出: HELLO WORLD
    
   

flatMap()

flatMap() 方法与 map() 方法类似,区别在于 flatMap 中的 mapping 函数返回值必须是 Optional。

Optional
    optional = Optional.of("Hello World");

Function
    > function = s -> Optional.of(s.toUpperCase());

Optional
      flatMapOptional = optional.flatMap(function);

System.out.println(flatMapOptional.get()); // 输出: HELLO WORLD
     
    
   

小结

Optional提供了一个比null更好的方式来表示一个值不存在的情况。如果我们使用得当,它可以帮助我们避免NullPointException的发生。

整篇文章都着重于让大家了解Optional是什么,它们如何工作,以及为什么对代码质量有所帮助。记住,在正确地使用Optional时,代码将更具可读性,更加健壮。