Java 8 新特性(五):Optional类

本文详细介绍了Java 8引入的Optional类,旨在消除null检查,提供链式编程和条件过滤的能力。通过分析Optional的源码、构造函数和常用方法,以及示例代码展示其在实际应用中的使用,帮助开发者更好地理解和利用这一新特性。
摘要由CSDN通过智能技术生成

Java 8 新特性(五):Optional类

Java 8 之前,面对可能为空的各类对象,我们往往需要一个类似 obj!=null 的判断来进行Java 8 引入了一个新的 Optional 类,用来进行对象是否为 null 的判断。

概述

Optional 的完整路径是 java.util.Optional,使用它是为了避免代码中的 if (obj != null) { } 这样范式的代码,可以采用链式编程的风格。而且通过 Optional 中提供的 filter 方法可以判断对象是否符合条件,在符合条件的情况下才会返回,map 方法可以在返回对象前修改对象中的属性。

Optional源码

1 Optional 的属性

/**
 * 一个公共空Optional实例
 */
private static final Optional<?> EMPTY = new Optional<>();

/**
 * 如果非空,则value值存在,否则value值为null
 */
private final T value;

2 构造函数

Optional有两个构造函数,一个无参构造,一个有参构造。两者都是私有方法,因此,在代码中,不能够通过调用构造方法进行Optional对象的创建。

其中,无参构造只在 EMPTY 被赋值时使用,被用来创建了一个value为null的Optional对象。有参构造仅被of()直接调用。

    /**
     * 无参构造方法,构造一个value为空的Optional对象,是一个私有构造方法
     */
    private Optional() {
   
        this.value = null;
    }

		/**
     * 有参构造方法
     * 如果value为null,则抛出空指针异常,否则将值赋给Optional对象的value属性
     * 也是一个私有构造函数
     */
    private Optional(T value) {
   
        this.value = Objects.requireNonNull(value);
    }

3 常用方法

/**
 * 返回一个空的Optional对象
 */
public static<T> Optional<T> empty() {
   
    @SuppressWarnings("unchecked")
    Optional<T> t = (Optional<T>) EMPTY;
    return t;
}

/**
 * 有参构造方法
 * 如果value为null,则抛出空指针异常,否则将值赋给Optional对象的value属性
 * 也是一个私有构造函数
 */
private Optional(T value) {
   
    this.value = Objects.requireNonNull(value);
}

/**
 * 调用有参构造方法,返回一个value为入参的Optional对象
 * 若入参为null,会抛出空指针异常
 */
public static <T> Optional<T> of(T value) {
   
    return new Optional<>(value);
}

/**
 * 返回一个Optional对象,value值为入参
 * 允许value值为null,若为null则调用empty()进行返回
 */
public static <T> Optional<T> ofNullable(T value) {
   
    return value == null ? empty() : of(value);
}

/**
 * 获取Optional对象的value值
 * 若为空,则抛异常NoSuchElementException
 */
public T get() {
   
    if (value == null) {
   
        throw new NoSuchElementException("No value present");
    }
    return value;
}

/**
 * 判断value值是否为null
 * 为null,则返回false,否则返回true
 */
public boolean isPresent() {
   
    return value != null;
}

/**
 * 如果value不为null,执行consumer的accept方法进行相应逻辑
 * 否则,不做任何操作
 */
public void ifPresent(Consumer<? super T> consumer) {
   
    if (value != null)
        consumer.accept(value);
}

/**
 * filter方法的参数是内置函数式接口-断言接口Predicate的实现类
 * 首先判断实现类是否为空,若空则抛异常
 * 然后判断value是否为null,为null时直接返回空的Optional
 * 不为null是判断是否满足要求predicate的test条件,满足则返回其本身,否则返回空的Optional
 */
public Optional<T> filter(Predicate<? super T> predicate) {
   
    Objects.requireNonNull(predicate);
    if (!isPresent())
        return this;
    else
        return predicate.test(value) ? this : empty();
}

/**
 * map方法
 * map的参数是Function接口的实现类
 * 当value为null时,返回空的Optional
 * 不为null时,调用参数的apply方法并返回ofNullable(结果)的Optional对象
 */
public<U> Optional<U> map(Function
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值