`

读java Optional 源码

    博客分类:
  • java
阅读更多
//该类是jdk1.8新增的类,主要是为了解决NPE问题。

//先看构造函数:

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

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

//可以看到构造函数都是私有的。所以可以推测创建该对象的方法应该是静态的。

//来看创建对象的方法:(都是静态方法)

   //结合上面的构造方法可以看到如果传入的value为null,会抛出NPE.
   public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
   //可以传入NULL
   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;
    }
  //获取对象。如果未null会抛NPE.
  public T get() {
        if (value == null) {
            throw new NoSuchElementException("No value present");
        }
        return value;
    }
  //是否有value
  public boolean isPresent() {
        return value != null;
    }
  //如果有值,就消费该值
  public void ifPresent(Consumer<? super T> consumer) {
        if (value != null)
            consumer.accept(value);
    }
  //符合当前断言则返回负责返回empty
  public Optional<T> filter(Predicate<? super T> predicate) {
        Objects.requireNonNull(predicate);
        if (!isPresent())
            return this;
        else
            return predicate.test(value) ? this : empty();
    }
  //通过Function转换当前对象
  public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Optional.ofNullable(mapper.apply(value));
        }
    }
  //平行转换 和map的区别在于这里不会用optional封装,而是直接返回optional。
  public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) {
        Objects.requireNonNull(mapper);
        if (!isPresent())
            return empty();
        else {
            return Objects.requireNonNull(mapper.apply(value));
        }
    }
 
  public T orElse(T other) {
        return value != null ? value : other;
    }
  //如果是null,则从Supplier函数中get
  public T orElseGet(Supplier<? extends T> other) {
        return value != null ? value : other.get();
    }
  
  //如果为空抛出异常
  public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {
        if (value != null) {
            return value;
        } else {
            throw exceptionSupplier.get();
        }
    }




分享到:
评论

相关推荐

    java8源码包含sun

    源码包含“sun”这一关键信息,意味着我们将讨论Java 8中与“sun”包相关的内容。"sun"包在Java中是一个内部使用的包,包含了Java平台的核心实现,通常不建议开发者直接使用。然而,了解这个包可以帮助我们深入理解...

    JAVA8 完整源码(包含Sun包源码)

    4. **Optional 类**:`java.util.Optional` 是一个容器对象,可能包含或不包含非null值。它的设计目的是减少空指针异常,并强制程序员明确处理缺失值,提高代码的健壮性。 5. **方法引用和构造器引用**:在 Lambda ...

    java8的源码

    `java.util.Optional`是Java 8引入的一个容器类,用于表示可能为null的值。通过使用Optional,可以避免空指针异常,使代码更清晰,更健壮。 6. **默认方法(default methods)** 在接口中添加默认方法是Java 8的...

    Java 8 源码

    这份"Java 8 源码"包含了完整的Java 8官方开放源代码,是Java开发者深入理解语言内部机制、提升编程技能的重要资源。通过阅读源码,开发者可以更好地掌握新特性,如Lambda表达式、Stream API、日期与时间API以及函数...

    javaJDK1.8 源码(.java文件) 新手教程资料

    8. **Optional类**:为了解决空指针异常问题,JDK 1.8引入了`Optional`类,源码可以揭示它是如何帮助开发者避免`NullPointerException`的。 9. **日期时间API**:JDK 1.8改进了日期和时间的处理,`java.time`包下的...

    ~_~java之经典源码大全~_~

    10. **Java高级特性**:如Lambda表达式、Stream API、Optional类等Java 8及以后版本引入的新特性,这些都能在源码中找到实际应用。 通过深入研究这份“java之经典源码大全”,开发者不仅可以巩固基础,还能提升对...

    Java 1.8 源码

    Java 1.8 源码是学习Java编程语言核心机制和高级特性的宝贵资源,它揭示了Java平台内部的工作原理。在这个版本中,Java引入了许多重要的改进和新特性,如Lambda表达式、Stream API、默认方法以及对并发处理的优化。...

    corejava8源码

    《深入解析Core Java 8源码》 Java作为世界上最受欢迎的编程语言之一,其核心库——Core Java,一直是开发者学习和研究的重要对象。本资料集合了Core Java 8的源码,旨在帮助开发者深入理解Java语言的基础和高级...

    java最新经典算法源码

    最后,`最新java练习题`和`最新java面试题`则是针对当前Java技术趋势的练习和面试题目,可能涉及到Java 8及以上版本的新特性,如Lambda表达式、Stream API、Optional类、并发改进等。了解并熟练应用这些新特性,可以...

    java 自学资源源码

    Java自学资源源码是针对那些想要通过自我学习掌握Java编程语言的人们提供的宝贵资料。这份压缩包文件包含的"java book"很可能是一个或多个Java教程的电子书或者代码示例集合,旨在帮助初学者理解Java的基本概念、...

    mysql-connector-java-5.1.26源码

    通过分析MySQL Connector/J的源码,开发者可以更好地理解JDBC的工作机制,学习数据库驱动的实现,这对于开发高效、健壮的Java数据库应用非常有帮助。同时,这也是提升数据库性能、排查问题和定制化需求的重要途径。

    Java基础知识源码分享

    "Java基础知识源码分享"提供了一系列的学习资源,旨在帮助初学者和开发者深入理解Java的核心概念。这个压缩包中的"learn"目录很可能是包含了多个子文件夹,每个子文件夹可能对应一个Java基础概念或技术。 1. **Java...

    OnJava8-Examples-3.0_soucecode_java_

    6. **Optional类**:为了解决null安全问题,Java 8引入了`Optional`类。它是一个容器类,代表一个值存在或不存在。这有助于避免空指针异常,提高代码的可读性和健壮性。 7. **接口的私有方法和静态方法**:Java 8...

    Java 1.8源码 jdk8u144源码

    5. **Optional 类**:`java.util.Optional`是一个容器对象,可能包含或不包含非null值。设计这个类是为了减少空指针异常,并强制程序员显式地处理缺失值,提高了代码的健壮性。 6. **日期和时间 API 的改进**:Java...

    Java学习笔记(源码)

    【Java学习笔记(源码)】是一份详细记录了Java编程语言学习过程的资源集合,包含实际的源代码示例。这份笔记旨在帮助初学者和有一定经验的开发者深入理解和掌握Java语言的核心概念、语法以及常见应用。以下是笔记中...

    jdk源码(完整版)

    **Java Development Kit (JDK) 源码详解** JDK,即Java Development Kit,是Java编程语言的核心组件,包含了编译器、运行时环境、工具集和其他必要的资源,用于开发和运行Java应用程序。这里提到的"jdk源码(完整版...

    学习java源码,java1.8

    Java源码的学习是每个Java开发者深入理解这门语言精髓的重要步骤。Java 1.8,也被称为Java 8,是Java发展历程中的一个里程碑版本,引入了许多创新特性,这些特性极大地提升了开发效率和代码质量。在这个压缩包文件...

    Java SE 8 for the Really Impatient 写给大忙人看的Java SE 8 源码

    通过本书的源码,读者可以深入理解以上特性在实际代码中的应用,体验Java 8带来的编程效率提升。学习时,应结合具体代码实例,动手实践,以达到最佳学习效果。此外,理解这些新特性的背后设计理念,对于成为一名优秀...

    java8源代码内容

    Java 8还引入了Optional类,用于表示可能为空的对象值。Optional类帮助避免空指针异常,鼓励开发者显式处理缺失值,提高了代码的健壮性。例如,`Optional&lt;String&gt; optional = Optional.ofNullable(getValue()); ...

    网上书店JAVA源码可以运行

    在描述中提到“我运行了一下,这个没错,可以用,运用了java的最新方法”,这暗示了该系统采用了现代Java技术栈,可能包括但不限于Java 8或更高版本的新特性,如Lambda表达式、Stream API、Optional类等,以及可能...

Global site tag (gtag.js) - Google Analytics