谈谈java8新特性Optional<T>

本文深入解析Java 8中Optional类的使用方法与核心API,包括of、ofNullable、get等方法的区别与应用场景,帮助程序员避免空指针异常,简化代码处理。
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>好的,我现在需要帮助用户理解JavaOptional类的泛型使用和实现细节,特别是empty()方法。首先,我应该回顾一下用户提供的引用内容,看看有没有相关的信息可以利用。 用户引用了三个关于Java Optional的示例,其中提到了flatMap、map、filter等方法的使用,以及如何避免空指针异常。这些引用主要涉及Optional的基本用法和最佳实践,但并没有直接提到泛型或empty()的具体实现。不过,通过分析这些例子,可以推断出Optional类在处理不同类型时的泛型应用。 接下来,我需要回忆Java中泛型的基本概念。泛型允许在类或方法中使用类型参数,提高代码的复用性和类型安全。Optional<T>是一个泛型类,其中的T表示包装的类型。例如,Optional<String>包装的是字符串,Optional<Integer>包装的是整数。 用户的问题集中在泛型在Optional中的使用和empty()方法的实现。首先,需要解释Optional类如何利用泛型来支持不同类型的值。然后,分析empty()方法,它返回一个空的Optional实例。由于泛型在运行时会被类型擦除,empty()方法可能通过静态成员或类型转换来实现,无论T是什么类型,都返回同一个空实例。 接下来,我需要验证这个思路是否正确。查阅Java源码,发现Optional的empty()方法确实返回一个静态常量EMPTY,其类型是Optional<Object>。当调用empty()时,通过强制转换将其转为Optional<T>,这样无论T是什么类型,都共享同一个空实例。这利用了泛型的类型擦除特性,因为运行时并不保留类型参数的具体信息。 然后,考虑用户可能的疑问,比如为什么empty()可以返回不同类型的Optional,以及类型擦除对泛型的影响。需要解释类型擦除的工作原理,以及Optional如何通过泛型在编译时保证类型安全,尽管运行时类型信息被擦除。 最后,确保回答结构清晰,分点讲解泛型应用和empty()的实现,并生成相关问题帮助用户进一步学习。同时,引用用户提供的资料,比如最佳实践中filter的使用,说明泛型在方法链中的应用。 总结步骤: 1. 介绍Optional的泛型设计。 2. 分析empty()方法的源码实现。 3. 解释类型擦除对empty()的影响。 4. 结合用户引用中的例子说明泛型的使用。 5. 生成相关问题巩固知识点。</think>### Java Optional类泛型解析与empty方法实现分析 #### 一、泛型在Optional类中的应用 1. **泛型类声明** Optional类的核心是使用泛型$T$来声明可包装任意类型的值: ```java public final class Optional<T> { private final T value; // 泛型字段 } ``` 例如: - $Optional<String>$ 包装字符串 - $Optional<Integer>$ 包装整型 2. **泛型方法应用** 通过泛型实现类型安全的方法链: ```java Optional.ofNullable(user) .filter(u -> u.getEmail().contains("@")) // 泛型保持User类型 .map(User::getEmail) // 转为Optional<String> ``` 引用示例中的过滤操作通过$filter$保持了泛型一致性[^3] #### 二、empty()方法实现原理 1. **源码实现** ```java private static final Optional<?> EMPTY = new Optional<>(null); public static<T> Optional<T> empty() { @SuppressWarnings("unchecked") Optional<T> t = (Optional<T>) EMPTY; // 强制类型转换 return t; } ``` - 静态常量$EMPTY$声明为$Optional<?>$通配符类型 - 通过强制类型转换返回$Optional<T>$实例 2. **类型擦除特性** 由于Java泛型采用类型擦除(Type Erasure),编译后泛型信息会被擦除。因此: $$Optional<String>.class == Optional<Integer>.class$$ 这使得所有$empty()$调用最终共享同一个$EMPTY$实例 #### 三、关键设计特点 1. **空对象复用** 所有类型的空Optional共享同一实例,减少内存开销 2. **类型安全验证** 编译时检查确保类型一致性: ```java Optional<String> s = Optional.empty(); // 合法 Optional<Integer> i = s; // 编译错误 ``` 3. **方法返回泛型** 像$flatMap$等方法通过泛型保持链式调用类型: ```java .flatMap(OptionalUtils::stringToInt) // 返回Optional<Integer> .filter(i -> i>0) // 保持Optional<Integer> ``` 引用示例展示了泛型在方法链中的传递[^1]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值