optional说明

1.说明

public final class Optional<T>
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> student = Optional.of(new Student());
        if (student.isPresent()) {
            // 执行结果
            System.out.println(student.get());
        } else {
            System.out.println("不存在");
        }

        // empty方法:创建一个空的 Optional 实例。结果为不存在
        Optional<Object> empty = Optional.empty();
        if (empty.isPresent()) {
            empty.get();
        } else {
            // 执行结果
            System.out.println("不存在");
        }

        // ofNullable:若 t 不为 null,创建 Optional 实例,否则创建空实例。
        Optional<Student> student1 = Optional.ofNullable(new Student());
        if (student1.isPresent()) {
            // 执行结果
            System.out.println(student1.get());
        } else {
            System.out.println("不存在");
        }

        // orElse(T t) : 如果调用对象包含值,返回该值,否则返回t。
        // 有值的场合
        Optional<Student> 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<Student> 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<Student> 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<Object> empty = Optional.empty();
            empty.get();

执行结果:
Exception in thread "main" java.util.NoSuchElementException: No value present
	at java.util.Optional.get(Optional.java:135)
	at com.example.demo.optional.OptionalDemo1.main(OptionalDemo1.java:29)

表示被请求的元素不存在。
        Optional<Object> empty = Optional.of(null);
        if (empty.isPresent()) {
            empty.get();
        } else {
            // 执行结果
            System.out.println("不存在");
        }

执行结果:
Exception in thread "main" java.lang.NullPointerException
	at java.util.Objects.requireNonNull(Objects.java:203)
	at java.util.Optional.<init>(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()方法判断是否有值,没有值得场合直接抛出异常;有值的场合继续后续处理。当然有时候传入的对象有可能是空对象。使用对象的某个具体的项目时要进行判断看看是否有值。

猜你喜欢

转载自blog.csdn.net/m0_72167535/article/details/129226411