`

读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();
        }
    }




分享到:
评论

相关推荐

    Java 判空 Optional 详解

    Java 判空 Optional 详解

    java8源码-Java8-Learning:Java8-学习

    源码 Java8-Learning JAVA8新特性 Optionals: Optional不是函数式接口,而是用于防止NullPointEXception的漂亮工具。Optional是一个简单的容器,其值可能是null或者不是null。在Java8之前一般某个函数应该返回非空...

    尚硅谷Java视频教程_Java11新特性

    00.尚硅谷_Java11_笔记、源码 01.尚硅谷_Java11_简介 02.尚硅谷_Java11_官方更新列表 03.尚硅谷_Java11_Shell 04.尚硅谷_Java11_集合中的新API1 05.尚硅谷_Java11_局部变量类型推断 06.尚硅谷_Java11_集合中的新API2...

    JAVA游戏毕业设计源码与论文

    在J2ME中还有一个重要的概念是可选包(Optional Package),它是针对特定设备提供的类库,比如某些设备是支持蓝牙的,针对此功能J2ME中制定了JSR82(Bluetooth API)提供了对蓝牙的支持。 目前,J2ME中有两个最主要...

    java8stream源码-Java8:Java8

    java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...

    java8stream源码-java8:java8

    java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...

    java8源码-java8:java8笔记和代码示例

    源码 java8 java8 note and code example java8新特性 Stream Api Lambda 表达式 行为参数化 接口中的默认方法 Date Time Api Optional 类 Stream 和 Collection的区别 Stream 描述对数据的计算 Collection 存储和...

    java8源码-stu-java8:stu-java8

    这个项目是我阅读了《java8实战》这本书,根据书籍提供的源码做了一些修改注释,用于以后查阅复习使用 lambda表达式 basics 流的构建与遍历 筛选与切片 映射 查找和匹配 归约 排序 示例/应用 collector(用流收集数据)...

    java8stream源码-lambdasinaction:java8在行动

    java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在此处购买抢先体验: 我们非常渴望听到您的反馈并根据您的评论改进本书! 所有示例的源...

    java8源码-guava-demo:番石榴演示

    重叠的功能,类似Java8有Collections,Arrays,Optional,StringUtils,Stream,Consumer等。所以在Java中没有所需要的 工具类封装时参考Guava的相关实现是一个不错的选择。学习心得如下: 1.字符串集合转换相关(Joiner,...

    java8stream源码-lambdasinaction:java8新特性

    java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...

    java8源码-jdk8:Java8(又称为jdk1.8)是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布Java

    源码 Java8 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的日期 API,新的Stream API 等。 Java8 新增了...

    java8stream源码-kimmisun:金米顺

    java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...

    java8stream源码-java8:Java8——函数式编程

    java8流源码java8 Java 8 —— 函数式编程 介绍 该存储库包含例如 Java 8 In Action 和 Java 8 Lambdas Pragmatic Functional Programming 一书中的源代码。 同时自己也做了一些扩展使用,修复了源码中的bug。 例如 ...

    java8函数式编程学习源码

    java8 lambda 函数式接口 Stream流 并行流 Optional 方法引用

    仿知乎java源码-mitmsocks4j:JAVASOCKS代理的中间人

    仿知乎java源码JAVA SOCKS 代理的中间人 SOCKS 代理协议的拦截器,允许用户转储任何连接的内容,即使它是用 SSL 保护的。 请注意,这不是通用代理服务器(性能问题和缺乏功能)。 我实际上是为了我检查移动应用程序...

    尚硅谷Java视频Java8新特性视频教程

    尚硅谷_Java8新特性_源码、课件 ·01. 尚硅谷_Java8新特性_简介 ·02. 尚硅谷_Java8新特性_为什么使用 Lambda 表达式 ·03. 尚硅谷_Java8新特性_Lambda 基础语法 ·04. 尚硅谷_Java8新特性_Lambda 练习 ·05. ...

    java8看不到源码-retro-optional:Java7的Java8选项的向后移植

    看不到源码 复古-可选 Java7 的 Java8 monad 选项的向后移植。 示例:假设我们有一个类A的实例,它可以为空,并且我们对获取嵌套函数调用链的结果感兴趣,最终将产生一个boolean 。 每个中间步骤都可能失败并返回...

    java8stream源码-Java8InAction:Java8InAction

    java8流源码Java8InAction 该存储库包含 Java 8 实战:Lambdas、Streams 和函数式编程一书中示例和测验的所有源代码。 您可以在这里购买这本书:或在亚马逊上 所有示例的源代码都可以在目录中找到 第 1 章:Java 8:...

Global site tag (gtag.js) - Google Analytics