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时,代码将更具可读性,更加健壮。