optional说明
迪丽瓦拉
2024-05-26 23:34:35
0

1.说明

public final class Optional
extends Object

可能包含或不包含非空值的容器对象。 如果一个值存在, isPresent()将返回trueget()将返回值。

提供依赖于存在或不存在包含值的其他方法,例如orElse() (如果值不存在则返回默认值)和ifPresent() (如果值存在则执行代码块)。

Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional 类的引入很好的解决空指针异常。

2.API

3.常用方法及示例

Optional 容器类的常用方法:

Optional.of(T t) : 创建一个 Optional 实例。

Optional.empty() : 创建一个空的 Optional 实例。

Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例。

isPresent() : 判断是否包含值。

orElse(T t) : 如果调用对象包含值,返回该值,否则返回t。

orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值。

map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()。

fiatMap(Function mapper);与 map 类似,要求返回值必须是Optional。

示例:

package com.example.demo.optional;import com.example.demo.domain.Student;import java.util.Optional;/*** @Author linaibo* @Date 2023/2/26 14:22* @PackageName:com.example.demo.optional* @ClassName: OptionalDemo1* @Version 1.0*/
public class OptionalDemo1 {public static void main(String[] args) {// of方法: 创建一个 Optional 实例。Optional student = Optional.of(new Student());if (student.isPresent()) {// 执行结果System.out.println(student.get());} else {System.out.println("不存在");}// empty方法:创建一个空的 Optional 实例。结果为不存在Optional empty = Optional.empty();if (empty.isPresent()) {empty.get();} else {// 执行结果System.out.println("不存在");}// ofNullable:若 t 不为 null,创建 Optional 实例,否则创建空实例。Optional student1 = Optional.ofNullable(new Student());if (student1.isPresent()) {// 执行结果System.out.println(student1.get());} else {System.out.println("不存在");}// orElse(T t) : 如果调用对象包含值,返回该值,否则返回t。// 有值的场合Optional empty1 = Optional.of(new Student());Student student2 = new Student();student2.setStudentId(1);student2.setStudentNo("123");student2.setStudentName("张三");Student student3 = empty1.orElse(student2);System.out.println(student3);// 无值的场合Optional empty12 = Optional.empty();Student student22 = new Student();student22.setStudentId(1);student22.setStudentNo("123");student22.setStudentName("张三");Student student33 = empty12.orElse(student22);System.out.println(student33);// orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值。Optional empty2 = Optional.empty();Student studen5 = empty2.orElseGet(() -> {Student student4 = new Student();student4.setStudentId(1);student4.setStudentNo("123");student4.setStudentName("张三");return student4;});System.out.println(studen5);}
}
 

error示例:

        // empty方法:创建一个空的 Optional 实例。结果为不存在Optional empty = Optional.empty();empty.get();执行结果:
Exception in thread "main" java.util.NoSuchElementException: No value presentat java.util.Optional.get(Optional.java:135)at com.example.demo.optional.OptionalDemo1.main(OptionalDemo1.java:29)表示被请求的元素不存在。 
        Optional empty = Optional.of(null);if (empty.isPresent()) {empty.get();} else {// 执行结果System.out.println("不存在");}执行结果:
Exception in thread "main" java.lang.NullPointerExceptionat java.util.Objects.requireNonNull(Objects.java:203)at java.util.Optional.(Optional.java:96)at java.util.Optional.of(Optional.java:108)at com.example.demo.optional.OptionalDemo1.main(OptionalDemo1.java:27)在of方法中直接传递一个null,则会出现空指针异常。 

4.总结

方法的返回值可以使用optional进行包装,避免空指针。

一般调用ofNullable()方法,然后使用isPresent()方法判断是否有值,没有值得场合直接抛出异常;有值的场合继续后续处理。当然有时候传入的对象有可能是空对象。使用对象的某个具体的项目时要进行判断看看是否有值。

相关内容