Java 9: Optional 的更新
在本系列的前一篇文章中,我们探讨了Java 9中Stream API的新特性。与Stream配合良好,并且实际上使Stream更加健壮的一个非常有用的API是Optional。让我们用JShell来探索它!
Optional提供了一个可能包含也可能不包含非空值的容器。它在Java 8中引入,旨在减少代码中可能产生NullPointerException的地方。
其基本API相当简单。我们可以创建一个空的Optional:
|
|
或者一个包含某些内容的Optional:
|
|
我们可以检查是否存在值:
|
|
我们还可以调用Optional暴露的相对简单API中的任何其他方法:
|
|
JDK 9添加了其中三个方法:ifPresentOrElse、or和stream,这些方法在某种程度上帮助我们处理默认值。
1. ifPresentOrElse
自Java 8以来,Optional提供了一个名为ifPresent的方法。该方法检查给定的Optional中是否存在值,如果找到,则对该值执行操作。否则,该方法不执行任何操作。例如:
|
|
Java 9引入了ifPresentOrElse。该方法的行为类似于ifPresent,但它允许我们指定在Optional中没有值时要执行的默认操作。例如:
|
|
当我们想要对值执行特定操作,但又想跟踪何时无法执行该操作时(例如通过触发事件、记录消息或更新指标),这非常有用。
2. or
or方法检查给定的Optional是否包含值。如果存在值,则返回描述该值的Optional(同一个Optional)。如果没有值存在,则返回由供应函数生成的新Optional。
该方法类似于我们从Java 8中了解的另外两个方法:orElse和orElseGet。
orElse如果给定Optional中存在值,则返回该值。否则,返回调用者提供的默认值。例如:
|
|
与orElse类似,orElseGet如果Optional中存在值,则返回该值。然而,与orElse不同的是,orElseGet允许我们指定一个供应函数,在Optional中没有值时返回默认值。例如:
|
|
orElse和orElseGet的共同点是它们返回Optional内部的值,而不是Optional本身。这就是新的or方法的用途:
|
|
尽管可能不是立即显而易见,但这个方法对于提供一种流畅的方式来链式操作Optional非常有用,而无需在容器和它们包装的值之间来回切换。
3. stream
API的另一个有用补充是stream方法。如果给定Optional中存在值,该方法返回一个仅包含该值的流。否则返回一个空流。例如:
|
|
在某种程度上,stream方法类似于流上的ofNullable方法。如果我们想利用流的惰性特性,它非常有用——例如,比较Optional上map方法的急切行为与流上map方法的惰性行为。当操作Optional流时,该方法也很有用。例如,当需要处理Optional流时,它特别适合作为传递给流上flatMap方法的映射器。
总体而言,Java 9中对Optional的添加可能看起来很小,但它们允许我们编写更清晰的代码,这非常令人兴奋。试试它们吧!