更新時間:2022-08-24 來源:黑馬程序員 瀏覽量:
回顧以前對null的處理方式
```java
public class OptionalTest {
public static void main(String[] args) {
test01("小黑");
test01(null);
}
public static void test01(String userName) {
if (userName != null) {
System.out.println("用戶名為: " + userName);
} else {
System.out.println("用戶名為null");
}
}
}
``` Optional類介紹
Optional是`JDK1.8`推出的一個新的類,是一個沒有子類的工具類,`Optional`可以理解為一個容器,其內(nèi)部僅能存放一個對象元素或者存放null。它的作用主要就是為了解決避免Null檢查,防止NullPointerException。

Optional的基本使用
Optional類的創(chuàng)建方式:
| 方法 | 說明 |
| ------------------------ | ------------------------------------------------------------ |
| Optional.of(T t) | 創(chuàng)建一個 Optional 實(shí)例,內(nèi)部保存t對象,如果t為null會出現(xiàn)空指針異常 |
| Optional.empty() | 創(chuàng)建一個空的 Optional 實(shí)例,內(nèi)部保存null |
| Optional.ofNullable(T t) | 若 t 不為 null,創(chuàng)建 Optional 實(shí)例,否則創(chuàng)建空實(shí)例 |
代碼演示:
```java
public static void test02() {
Optional<String> o1 = Optional.of("小馬");
// Optional<String> o2 = Optional.of(null); // 如果t為null會出現(xiàn)空指針異常
Optional<String> o3 = Optional.empty();
Optional<String> o4 = Optional.ofNullable(null);
System.out.println("o1 = " + o1);
// System.out.println("o2 = " + o2);
System.out.println("o3 = " + o3);
System.out.println("o4 = " + o4);
}
```
運(yùn)行效果:
```java o1 = Optional[小馬] o3 = Optional.empty o4 = Optional.empty ```
Optional類的常用方法:
| 方法 | 說明 |
| --------------------- | ---------------------------------------------------------- |
| isPresent() | 判斷是否包含值,包含值返回true,不包含值返回false |
| get() | 如果Optional有值則將其返回,否則拋出NoSuchElementException |
| orElse(T t) | 如果調(diào)用對象包含值,返回該值,否則返回參數(shù)t |
| orElseGet(Supplier s) | 如果調(diào)用對象包含值,返回該值,否則返回 s 獲取的值 |
代碼演示:
```java
public static void test03() {
Optional<String> o5 = Optional.of("小馬");
Optional<String> o6 = Optional.empty();
Optional<String> o7 = Optional.ofNullable(null);
// isPresent() : 判斷是否包含值,包含值返回true,不包含值返回false。
if (o5.isPresent()) {
// get() : 如果Optional有值則將其返回,否則拋出NoSuchElementException。
String userName = o5.get();
System.out.println("用戶名o5為:" + userName);
} else {
System.out.println("用戶名o5為null");
}
if (o6.isPresent()) {
String userName = o6.get();
System.out.println("用戶名o6為:" + userName);
} else {
System.out.println("用戶名o6為null");
}
if (o7.isPresent()) {
String userName = o7.get();
System.out.println("用戶名o7為:" + userName);
} else {
System.out.println("用戶名o7為null");
}
}
``` 運(yùn)行效果:
```java 用戶名o5為:小馬 用戶名o6為null 用戶名o7為null ```
Optional的高級使用
代碼演示:
```java
public static void test04() {
Optional<String> o8 = Optional.of("小程");
Optional<String> o9 = Optional.empty();
// 存在做的什么
o8.ifPresent(s -> System.out.println("用戶名o8為" + s));
o9.ifPresent(s -> System.out.println("用戶名o9為" + s));
}
public static void test05() {
Optional<String> o10 = Optional.of("小序");
Optional<String> o11 = Optional.empty();
// 如果調(diào)用對象包含值,返回該值,否則返回參數(shù)
System.out.println("用戶名o10為: " + o10.orElse("不存在數(shù)據(jù)10"));
System.out.println("用戶名o11為: " + o11.orElse("不存在數(shù)據(jù)11"));
// 如果調(diào)用對象包含值,返回該值,否則返回參數(shù)Supplier得到的值
String s10 = o10.orElseGet(() -> {return "未知用戶名10";});
System.out.println("s10 = " + s10);
String s11 = o11.orElseGet(() -> {return "未知用戶名11";});
System.out.println("s11 = " + s11);
}
```運(yùn)行效果:
```java 用戶名o8為小程 用戶名o10為: 小序 用戶名o11為: 不存在數(shù)據(jù)11 s10 = 小序 s11 = 未知用戶名 ```
總結(jié)
`Optional`可以理解為一個容器,其內(nèi)部僅能存放一個對象元素或者存放null。它的作用主要就是為了解決避免Null檢查,防止NullPointerException。
`Optional`的`orElse`,`ifPresent`,`orElseGet`等方法避免對null的判斷,寫出更加優(yōu)雅簡潔的代碼。