Optional源码分析(涉及Objects源码和Stream源码)

简介: 本文分析了Java中Optional类的源码,包括其内部的Objects.requireNonNull方法、EMPTY定义、构造方法、ofNullable方法、isEmpty方法以及如何与Stream类交互,展示了Optional类如何避免空指针异常并提供流式操作。

研究Optional源码之前先谈一谈Objects源码。

主要代码:

  @ForceInline
    public static <T> T requireNonNull(T obj) {
        if (obj == null) {
            throw new NullPointerException();
        } else {
            return obj;
        }
    }

    @ForceInline
    public static <T> T requireNonNull(T obj, String message) {
        if (obj == null) {
            throw new NullPointerException(message);
        } else {
            return obj;
        }
    }

这个代码很简单等于null就抛异常,不等于null就返回原先的对象,在Optional的引用为:

  public Optional<T> filter(Predicate<? super T> predicate) {
        Objects.requireNonNull(predicate);
        if (this.isEmpty()) {
            return this;
        } else {
            return predicate.test(this.value) ? this : empty();
        }
    }

       public <U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        return this.isEmpty() ? empty() : ofNullable(mapper.apply(this.value));
    }

    public <U> Optional<U> flatMap(Function<? super T, ? extends Optional<? extends U>> mapper) {
        Objects.requireNonNull(mapper);
        if (this.isEmpty()) {
            return empty();
        } else {
            Optional<U> r = (Optional)mapper.apply(this.value);
            return (Optional)Objects.requireNonNull(r);
        }
    }

    public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier) {
        Objects.requireNonNull(supplier);
        if (this.isPresent()) {
            return this;
        } else {
            Optional<T> r = (Optional)supplier.get();
            return (Optional)Objects.requireNonNull(r);
        }
    }

可以看到在每一个操作前面都进行了Objects.requireNonNull(对象);的这个判断

@ValueBased
public final class Optional<T> {
    private static final Optional<?> EMPTY = new Optional((Object)null);
    private final T value;

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

Optional类有一个变量为T value对象,这个对象则是用于存传进的参数对象的。

    private Optional(T value) {
        this.value = value;
    }
 public static <T> Optional<T> ofNullable(T value) {
        return value == null ? EMPTY : new Optional(value);
    }

这个代码就很有意思。value要是等于null的话,就让它转化为Optional对象,从而避免空指针异常。


    public boolean isEmpty() {
        return this.value == null;
    }
 public Stream<T> stream() {
        return this.isEmpty() ? Stream.empty() : Stream.of(this.value);
    }

this.isEmpty()为true返回Stream.empty(),否则就返回Stream.of(this.value),转化为Stream类型。

以下是steam的empty源码。

  static <T> Stream<T> empty() {
        return StreamSupport.stream(Spliterators.emptySpliterator(), false);
    }

该方法就是返回一个空的Stream

而Stream.of(this.value)就是单纯的把value对象放进stream流里面。

代码演示:

可知不会出现空指针异常。

目录
相关文章
|
6月前
|
自然语言处理 Java API
Java 8的Stream API和Optional类:概念与实战应用
【5月更文挑战第17天】Java 8引入了许多重要的新特性,其中Stream API和Optional类是最引人注目的两个。这些特性不仅简化了集合操作,还提供了更好的方式来处理可能为空的情况,从而提高了代码的健壮性和可读性。
169 7
|
3月前
|
Java API
Java8 Lambda 设计和实现问题之在Java 8的Stream API中,parallel=false时collect方法是如何实现的
Java8 Lambda 设计和实现问题之在Java 8的Stream API中,parallel=false时collect方法是如何实现的
|
5月前
|
Java API 容器
Java 8 的流库:Filter、Map、FlatMap 及 Optional 的概念与用法
【6月更文挑战第9天】Java 8 引入了许多强大的新特性,其中流库(Stream API)和 Optional 类极大地简化了集合操作和空值处理。本文将深入探讨 filter、map、flatMap 以及 Optional 的概念和用法,并提供示例代码来展示其实际应用。
76 4
|
5月前
|
存储 安全 Java
Java 集合(List、Set、Map 等)相关问答归纳再整理
HashMap 中使用键对象来计算 hashcode 值 HashSet 使用成员对象来计算 hashcode 值,对于两个对象来说hashcode 可能相同,所以 equals() 方法用来判断对象的相等性,如果两个对象不同的话,那么返回 false。 HashMap 比较快,因为是使用唯一的键来获取对象,HashSet 较 HashMap 来说比较慢。 4.1.3 HashMap 与 TreeMap
33 2
|
5月前
|
Java API
JavaSE——常用API进阶一(2/3)-Objects类(equals方法、isNull方法、nonNull方法)、包装类(介绍、包装方法及自动装拆箱、其他常见操作)
JavaSE——常用API进阶一(2/3)-Objects类(equals方法、isNull方法、nonNull方法)、包装类(介绍、包装方法及自动装拆箱、其他常见操作)
38 0
|
5月前
|
Java API
JavaSE——常用API进阶一(1/3)-Object类(Object类的作用、Object类的常见方法-toString方法、equal方法、clone方法)
JavaSE——常用API进阶一(1/3)-Object类(Object类的作用、Object类的常见方法-toString方法、equal方法、clone方法)
37 0
|
6月前
|
存储 JavaScript 前端开发
java9新特性之-String存储结构变更--集合工厂方法-- InputStream 加强--增强的 Stream API讲解
java9新特性之-String存储结构变更--集合工厂方法-- InputStream 加强--增强的 Stream API讲解
76 0
|
缓存 安全 Java
ArrayList源码分析之add 方法
ArrayList源码分析之add 方法
133 0
|
存储 安全 Java
源码解析JDK 1.8 中的 Map.merge()
源码解析JDK 1.8 中的 Map.merge()
源码解析JDK 1.8 中的 Map.merge()
|
Java API
java8实战读书笔记:数值流、Stream创建与Optional类的使用
java8实战读书笔记:数值流、Stream创建与Optional类的使用
java8实战读书笔记:数值流、Stream创建与Optional类的使用