Java中Optional.of()方法及源码解析(非常详细!)

 更新时间:2024年06月08日 08:55:43   作者:c137范特西  
这篇文章主要给大家介绍了关于Java中Optional.of()方法及源码解析的相关资料,Java中java.util .Optional类的of()方法用于获得该Optional类中具有指定类型的指定值的一个实例,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

在Java中,Optional.of() 方法是 Optional 类中用于创建包含非空值的 Optional 对象的静态方法。在本文中,我们将深入解析 Optional.of() 的语法、使用场景,并通过多个示例详细说明。

方法解析

1. Optional.of() 方法的语法

public static <T> Optional<T> of(T value)
  • 参数: 非空的值 value
  • 返回值: 包含指定值的 Optional 对象。

2. 使用示例

2.1 创建包含字符串的 Optional 对象

Optional<String> optional = Optional.of("Hello, World!");

上述代码创建了一个包含字符串 “Hello, World!” 的 Optional 对象。由于传入的值是非空的,因此不会引发 NullPointerException

2.2 创建包含自定义对象的 Optional 对象

class Person {
    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

Person person = new Person("John Doe");
Optional<Person> optionalPerson = Optional.of(person);

这个示例中,我们定义了一个 Person 类,并使用 Optional.of() 创建了一个包含 Person 对象的 Optional 对象。

2.3 注意事项

Optional<String> optional = Optional.of(null); // 会抛出 NullPointerException

Optional.of() 要求传入的值不能为 null,否则会抛出 NullPointerException。在上述示例中,传入了 null 值,导致抛出异常。

3. 使用场景

Optional.of() 适用于确定值不为空的情况,提供了一种安全的方式来包装非空值,避免了空指针异常。但需要注意确保传入的值非空,否则会引发异常。

源码解析

1. Optional.of() 方法的源码

public static <T> Optional<T> of(T value) {
    return new Optional<>(Objects.requireNonNull(value));
}

上述源码显示了 Optional.of() 方法的实现。以下是对源码的解析:

  • public static <T> Optional<T> of(T value) {: 这是一个静态方法声明,返回类型是 Optional<T>,其中 <T> 是泛型参数,表示 Optional 包含的值的类型。参数 value 是需要包装的非空值。

  • return new Optional<>(Objects.requireNonNull(value));: 在方法体内,首先使用 Objects.requireNonNull(value) 确保传入的值不为 null。如果传入的值为 nullObjects.requireNonNull 方法会抛出 NullPointerException

    然后,通过 new Optional<>(...) 创建一个新的 Optional 对象,将传入的非空值包装在其中。

2. 源码解析总结

  • Optional.of() 方法通过 Objects.requireNonNull 确保传入的值非空,否则抛出 NullPointerException
  • 创建了一个新的 Optional 对象,并将传入的非空值包装在其中。

3. 注意事项

在使用 Optional.of() 时,一定要确保传入的值不为 null,否则会导致异常。如果不能确定值是否为 null,建议使用 Optional.ofNullable() 方法。

4. Optional 类的基本结构

在深入解析 Optional.of() 的源码之前,我们先了解一下 Optional 类的基本结构。Optional 类的核心思想是包装可能为 null 的值,提供了一些方法来处理这种情况。

public final class Optional<T> {

    private static final Optional<?> EMPTY = new Optional<>();

    private final T value;

    private Optional() {
        this.value = null;
    }

    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }

    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }

    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }

    public static <T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }

    public boolean isPresent() {
        return value != null;
    }

    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }

    // 其他方法省略...
}

上述是 Optional 类的简化版本,其中包含了 of() 方法的源码。关键部分解析如下:

  • EMPTYOptional 类的一个静态常量,表示空的 Optional 对象。
  • value:私有字段,用于保存包装的值。
  • of(T value):静态工厂方法,用于创建包含非空值的 Optional 对象。
  • ofNullable(T value):静态工厂方法,用于创建包含可能为 null 值的 Optional 对象。
  • empty():静态工厂方法,用于创建空的 Optional 对象。
  • isPresent():判断 Optional 对象是否包含值。
  • get():获取 Optional 对象中的值,如果值为空则抛出 NoSuchElementException

6. Optional.of() 源码解析

现在我们来看一下 Optional.of() 方法的源码:

public static <T> Optional<T> of(T value) {
    return new Optional<>(value);
}

这个方法非常简单,它直接调用 Optional 类的私有构造函数 private Optional(T value) 来创建一个新的 Optional 对象,并将传入的值包装在其中。

private Optional(T value) {
    this.value = Objects.requireNonNull(value);
}

在构造函数中,首先通过 Objects.requireNonNull(value) 确保传入的值非空,否则抛出 NullPointerException。然后将非空值保存在 value 字段中。

这就是 Optional.of() 方法的基本逻辑。总体来说,Optional 类提供了一种安全地处理可能为 null 值的方式,而 Optional.of() 则是其中的一个关键方法,用于创建包含非空值的 Optional 对象。

4. 总结

Optional.of() 是创建包含非空值的 Optional 对象的方法。通过深入解析其语法、使用示例以及注意事项,我们更好地理解了该方法的作用和适用场景。在使用时,确保传入的值非空,以保证安全使用 Optional。在不确定值是否为空的情况下,建议使用 Optional.ofNullable() 方法。

附:Optional.of()和Optional.ofNullable()区别

Optional.of()或者Optional.ofNullable():创建Optional对象,差别在于of不允许参数是null,而ofNullable则无限制。

// 参数不能是null,是null抛异常
Optional<Integer> optional1 = Optional.of(1);
 
// 参数可以是null
Optional<Integer> optional2 = Optional.ofNullable(null);
 
// 参数可以是非null
Optional<Integer> optional3 = Optional.ofNullable(2);

空指针异常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

通过of(T value)函数所构造出的Optional对象,当Value值为空时,依然会报NullPointerException。

到此这篇关于Java中Optional.of()方法及源码解析的文章就介绍到这了,更多相关Java Optional.of()方法源码解析内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 带大家深入了解Spring事务

    带大家深入了解Spring事务

    Spring框架提供统一的事务抽象,通过统一的编程模型使得应用程序可以很容易地在不同的事务框架之间进行切换. 在学习Spring事务前,我们先对数据库事务进行简单的介绍。,需要的朋友可以参考下
    2021-05-05
  • MyBatis Mapper XML中比较操作符转义问题解决

    MyBatis Mapper XML中比较操作符转义问题解决

    在使用MyBatis编写Mapper XML时,有时会遇到比较操作符需要进行转义的情况,本文主要介绍了MyBatis Mapper XML中比较操作符转义问题解决,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Java Mybatis的初始化之Mapper.xml映射文件的详解

    Java Mybatis的初始化之Mapper.xml映射文件的详解

    这篇文章主要介绍了Java Mybatis的初始化之Mapper.xml映射文件的详解,解析完全局配置文件后接下来就是解析Mapper文件了,它是通过XMLMapperBuilder来进行解析的
    2022-08-08
  • SpringMVC中事务是否可以加在Controller层的问题

    SpringMVC中事务是否可以加在Controller层的问题

    这篇文章主要介绍了SpringMVC中事务是否可以加在Controller层的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • Java工厂模式定义与用法实例分析

    Java工厂模式定义与用法实例分析

    这篇文章主要介绍了Java工厂模式定义与用法,结合具体实例形式分析了java工厂模式定义、使用相关操作技巧,并总结了类图原理,需要的朋友可以参考下
    2019-07-07
  • Java死锁的产生原因及解决方法总结

    Java死锁的产生原因及解决方法总结

    Java中的死锁是指多个线程同时占用一些共享资源且彼此相互等待,从而导致所有的线程都被阻塞,不能继续执行程序的情况,本文小编给大家介绍了Java死锁的产生原因及解决方法总结,需要的朋友可以参考下
    2023-11-11
  • Spring事件监听机制之@EventListener实现方式详解

    Spring事件监听机制之@EventListener实现方式详解

    这篇文章主要介绍了Spring事件监听机制之@EventListener实现方式详解,ApplicationContext的refresh方法还是初始化了SimpleApplicationEventMulticaster,发送事件式还是先获取ResolvableType类型,再获取发送监听列表,需要的朋友可以参考下
    2023-12-12
  • 浅谈Java中Spring Boot的优势

    浅谈Java中Spring Boot的优势

    在本篇文章中小编给大家分析了Java中Spring Boot的优势以及相关知识点内容,兴趣的朋友们可以学习参考下。
    2018-09-09
  • Java的Semaphore信号量使用及原理解读

    Java的Semaphore信号量使用及原理解读

    这篇文章主要介绍了Java的Semaphore信号量使用及原理解读,Semaphore(信号量)是Java中一个并发控制工具,用于控制对共享资源的访问,它基于计数器的原理,可以限制同时访问某个资源的线程数量,需要的朋友可以参考下
    2023-12-12
  • java hashtable实现代码

    java hashtable实现代码

    这篇文章介绍了java hashtable实现代码,有需要的朋友可以参考一下
    2013-10-10

最新评论