更新时间: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`可以理解为一个容器,其内部仅能存放一个对象元素或者存放null。它的作用主要就是为了解决避免Null检查,防止NullPointerException。
Optional的基本使用
Optional类的创建方式:
| 方法 | 说明 |
| ------------------------ | ------------------------------------------------------------ |
| Optional.of(T t) | 创建一个 Optional 实例,内部保存t对象,如果t为null会出现空指针异常 |
| Optional.empty() | 创建一个空的 Optional 实例,内部保存null |
| Optional.ofNullable(T t) | 若 t 不为 null,创建 Optional 实例,否则创建空实例 |
代码演示:
```java public static void test02() { Optional<String> o1 = Optional.of("小马"); // Optional<String> o2 = Optional.of(null); // 如果t为null会出现空指针异常 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); } ```
运行效果:
```java o1 = Optional[小马] o3 = Optional.empty o4 = Optional.empty ```
Optional类的常用方法:
| 方法 | 说明 |
| --------------------- | ---------------------------------------------------------- |
| isPresent() | 判断是否包含值,包含值返回true,不包含值返回false |
| get() | 如果Optional有值则将其返回,否则抛出NoSuchElementException |
| orElse(T t) | 如果调用对象包含值,返回该值,否则返回参数t |
| orElseGet(Supplier s) | 如果调用对象包含值,返回该值,否则返回 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"); } } ```
运行效果:
```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(); // 如果调用对象包含值,返回该值,否则返回参数 System.out.println("用户名o10为: " + o10.orElse("不存在数据10")); System.out.println("用户名o11为: " + o11.orElse("不存在数据11")); // 如果调用对象包含值,返回该值,否则返回参数Supplier得到的值 String s10 = o10.orElseGet(() -> {return "未知用户名10";}); System.out.println("s10 = " + s10); String s11 = o11.orElseGet(() -> {return "未知用户名11";}); System.out.println("s11 = " + s11); } ```
运行效果:
```java 用户名o8为小程 用户名o10为: 小序 用户名o11为: 不存在数据11 s10 = 小序 s11 = 未知用户名 ```
总结
`Optional`可以理解为一个容器,其内部仅能存放一个对象元素或者存放null。它的作用主要就是为了解决避免Null检查,防止NullPointerException。
`Optional`的`orElse`,`ifPresent`,`orElseGet`等方法避免对null的判断,写出更加优雅简洁的代码。
【AI设计】北京143期毕业仅36天,全员拿下高薪offer!黑马AI设计连续6期100%高薪就业
2025-09-19【跨境电商运营】深圳跨境电商运营毕业22个工作日,就业率91%+,最高薪资达13500元
2025-09-19【AI运维】郑州运维1期就业班,毕业14个工作日,班级93%同学已拿到Offer, 一线均薪资 1W+
2025-09-19【AI鸿蒙开发】上海校区AI鸿蒙开发4期5期,距离毕业21天,就业率91%,平均薪资14046元
2025-09-19【AI大模型开发-Python】毕业33个工作日,就业率已达到94.55%,班均薪资20763元
2025-09-19【AI智能应用开发-Java】毕业5个工作日就业率98.18%,最高薪资 17.5k*13薪,全班平均薪资9244元
2025-09-19