谈谈java8新特性Optional<T>

本文深入解析Java 8中Optional类的使用方法与核心API,包括of、ofNullable、get等方法的区别与应用场景,帮助程序员避免空指针异常,简化代码处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java.lang.NullPointerException

相信对每一个java程序员来说都不陌生的,常常因为缺少一个判空导致系统各自通讯错误,异常。从java8开始,给我们提供了一个对象判空操作处理类Optional。
在这里插入图片描述

根据jdk8官方文档,可以知道,该根据类存在于java.util下的final类,也就是说是官方提供给我们的一个工具类。
当然首先我们来看下具体的使用方法:

 Optional<String> optionalS = Optional.of(new String("baomw"));
 System.out.println(optionalS.get());

如上,代码非常简单:效果如下
在这里插入图片描述
核心api说明如下:
方法 描述

api说明
of把指定的值封装为Optional对象,如果指定的值为null,则抛出NullPointerException
ofNullable把指定的值封装为Optional对象,如果指定的值为null,则创建一个空的Optional对象
get如果创建的Optional中有值存在,则返回此值,否则抛出NoSuchElementException
isPresent如果创建的Optional中的值存在,返回true,否则返回false
ifPresent如果创建的Optional中的值存在,则执行该方法的调用,否则什么也不做
orElse如果创建的Optional中有值存在,则返回此值,否则返回一个默认值
orElseGet如果创建的Optional中有值存在,则返回此值,否则返回一个由Supplier接口生成的值
empty创建一个空的Optional对象
orElseThrow如果创建的Optional中有值存在,则返回此值,否则抛出一个由指定的Supplier接口生成的异常
filter如果创建的Optional中的值满足filter中的条件,则返回包含该值的Optional对象,否则返回一个空的Optional对象
map如果创建的Optional中的值存在,对该值执行提供的Function函数调用
flagMap如果创建的Optional中的值存在,就对该值执行提供的Function函数调用,返回一个Optional类型的值,否则就返回一个空的Optional对象
/**
     * Common instance for {@code empty()}.
     */
    private static final Optional<?> EMPTY = new Optional<>();
    /**
     * Returns an {@code Optional} with the specified present non-null value.
     *
     * @param <T> the class of the value
     * @param value the value to be present, which must be non-null
     * @return an {@code Optional} with the value present
     * @throws NullPointerException if value is null
     */
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
    /**
     * Returns an {@code Optional} describing the specified value, if non-null,
     * otherwise returns an empty {@code Optional}.
     *
     * @param <T> the class of the value
     * @param value the possibly-null value to describe
     * @return an {@code Optional} with a present value if the specified value
     * is non-null, otherwise an empty {@code Optional}
     */
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
    /**
     * If a value is present in this {@code Optional}, returns the value,
     * otherwise throws {@code NoSuchElementException}.
     *
     * @return the non-null value held by this {@code Optional}
     * @throws NoSuchElementException if there is no value present
     *
     * @see Optional#isPresent()
     */
    public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }
        /**
	     * Return {@code true} if there is a value present, otherwise {@code false}.
	     *
	     * @return {@code true} if there is a value present, otherwise {@code false}
	     */
	    public boolean isPresent() {
	        return value != null;
	    }

核心api及关键点如上,注意比较ofofNullable经常会有出现使用Optional.of创建Optional对象时报空指针,因为(如下)是of创建Optional对象的构造方法,发现如果传入的value为null时,会抛出一个空指针异常。

  private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }
    
    public static <T> T requireNonNull(T obj) {
        if (obj == null)
            throw new NullPointerException();
        return obj;
    }

而对于ofNullable上述源码可以看出,有一个三目表达式,如果value为空,则创建一个空的Optional对象。

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

如上可以根据实际需要适当选取构造方法。

经常在代码中会有这样的写法,如果值为空就给个默认值的情况:

if(str == null){
	return new String("baomw");
}else{
	return str;
}

当然如果用Optional.orElse(method)就使得这样子的写法异常简单。

  return Optional.ofNullable(str).orElse(new String("baomw"));

使用orElse方法,就很好的解决了,如果值不为空则返回,否则执行orElse里面的方法并返回其返回值。

关于更多其他api的详细用法,有兴趣的可以自己试一下。

<think>我们正在分析`Optional.empty()`的实现。根据提供的代码片段: ```java private static final Optional<?> EMPTY = new Optional<>(null); private final T value; public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; return t; } ``` ### 问题解析:`Optional.empty()`返回的是什么? #### 1. **返回对象本质** - **单例空对象**:`empty()`方法返回的是`EMPTY`常量(一个静态不可变的空`Optional`实例)。 - **内部状态**:该实例的`value`字段为`null`(由`new Optional<>(null)`初始化)。 #### 2. **类型转换说明** ```java Optional<T> t = (Optional<T>) EMPTY; // 强制类型转换 ``` - **类型擦除**:由于Java泛型擦除,`Optional<?>`可安全转为`Optional<T>`(运行时类型相同)。 - **空值通用性**:无论`T`是什么类型,空`Optional`的行为一致(无实际值)。 #### 3. **使用示例** ```java Optional<String> emptyOpt = Optional.empty(); System.out.println(emptyOpt.isPresent()); // 输出 false ``` #### 4. **设计优势** - **内存高效**:整个JVM中只有一个`EMPTY`实例(静态常量),避免重复创建空对象。 - **类型安全**:通过泛型方法保证返回类型与调用处期望的类型匹配(如`Optional<String>`)。 ### 关键点总结 | 特性 | 说明 | |--------------|----------------------------------------------------------------------| | **返回内容** | 静态常量`EMPTY`(类型为`Optional<?>`,但被转换为调用所需的泛型类型) | | **值状态** | 内部`value`字段为`null` | | **单例性** | 全局唯一空实例 | §§相关问题§§ 1. 为什么JavaOptional.empty()要设计成返回单例而不是每次new一个新对象? 2. 在Optional.empty()的实现中,为什么需要进行强制类型转换(Optional<T>)? 3. 如果尝试对Optional.empty()返回的对象调用get()方法会发生什么? 4. Optional类中的EMPTY常量为什么使用通配符类型Optional<?>? 5. 如何判断一个Optional对象是否是通过Optional.empty()创建的?</think>### 解析:`Optional.empty()` 返回值及原理 #### 1. **返回值本质** `Optional.empty()` 返回的是 **全局唯一的空 Optional 对象**: ```java private static final Optional<?> EMPTY = new Optional<>(null); ``` - 该对象是 `static final` 修饰的静态常量 - 其内部字段 `value` 被初始化为 `null` - 无论调用多少次 `empty()`,都返回 **同一个 EMPTY 实例** #### 2. **类型转换机制(关键)** ```java public static<T> Optional<T> empty() { Optional<T> t = (Optional<T>) EMPTY; // 强制类型转换 return t; } ``` - **泛型擦除**:运行时 `Optional<String>` 和 `Optional<Integer>` 都是 `Optional` 类 - **安全转换**:因为 `EMPTY` 的 `value=null`(无类型数据),可安全转为任意 `Optional<T>` - `@SuppressWarnings("unchecked")`:编译器忽略类型转换警告 #### 3. **内存模型示例** ```mermaid graph LR A[调用 Optional.empty] --> B[获取静态区 EMPTY 实例] B --> C[强制转换为调用方需要的泛型类型 Optional<T>] C --> D[返回唯一空对象] ``` #### 4. **验证代码** ```java Optional<String> opt1 = Optional.empty(); Optional<Integer> opt2 = Optional.empty(); System.out.println(opt1 == opt2); // 输出 true(同一对象) System.out.println(opt1.get()); // 抛出 NoSuchElementException ``` #### 5. **设计意义** - **避免内存浪费**:全局单例节省重复创建开销 - **空对象模式**:提供安全的"无值"表示方式 - **类型统一**:`Optional.empty()` 可赋值给任意 `Optional<T>` 变量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值