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

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

主要代码:

  @ForceInlinepublic static <T> T requireNonNull(T obj) {if (obj == null) {throw new NullPointerException();} else {return obj;}}@ForceInlinepublic 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流里面。

代码演示:

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

这次看点赞和收藏的人数,过十个就更新stream源码。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/245244.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单个 Zip 文件体积超过 40GB

单个 Zip 文件体积超过 40GB WinRAR 平时用的多,不过有时候为了更好的通用性,也常常用到 zip 格式.查了一下资料,说是 zip 单个文件的体积不能超过 4GB. 自己动手试了下,用 WinRAR 创建出来的 zip 文件,大小可以超过 40GB, 如下图 为了压缩速度快,压缩方式用的是 “存储” Wi…

PHP使用HTTP代码示例模板

PHP是一种广泛用于服务器端的编程语言&#xff0c;它提供了许多内置的函数和扩展&#xff0c;以便开发人员能够轻松地处理HTTP请求和响应。在PHP中&#xff0c;您可以使用以下代码示例模板来处理HTTP请求和生成HTTP响应。 php复制代码 <?php // 处理GET请求 if ($…

Synchronized关键字的底层原理

Synchronized实现 Synchronized创建的时候一个互斥的对象锁&#xff0c;每次只有一个线程可以获取该锁。 其底层主要是基于Monitor实现的&#xff0c;在对象的对象头中存储了MarkWord存储的就是Monitor的地址。 对象的内存结构 对象在内存中存储主要分为三个部分&#xff1a…

天翼云:“百万IOPS”助推政企上云

随着数字化转型的加速&#xff0c;越来越多的企业选择了业务上云。众所周知&#xff0c;不论是政企关键/核心业务中的大型数据库、NoSQL、AI训练&#xff0c;还是互联网业务中的游戏、渲染等场景&#xff0c;对数据读写IOPS和时延有极高的要求。作为全球领先的云服务商&#xf…

第二证券:国际金价创新高 国内锂电企业有望加速出海

12月首个交易日&#xff0c;两市股指盘中弱势下探&#xff0c;午后止跌回升&#xff0c;沪指、创业板指翻红&#xff0c;北证50指数再度跳水。到收盘&#xff0c;沪指微涨0.07%报3031.64点&#xff0c;深成指跌0.07%报9720.57点&#xff0c;创业板指涨0.19%报1926.28点&#xf…

SWD和JTAG

1、调试接口概念 1&#xff09;SWD&#xff1a;Serial Wire Debug&#xff0c;代表串行线调试&#xff0c;是ARM设计的协议&#xff0c;用于对其微控制器进行编程和调试。 SWD 引脚&#xff1a; SWDIO–串行数据线&#xff0c;用于数据的读出和写入SWDCLK–串行时钟线&#…

微积分-圆的面积和周长(1)

微积分 历史 先有牛顿后有天&#xff0c;创世之后再造仙。作为近代物理学的开山鼻祖&#xff0c;牛顿的贡献怎么评价都不为过。而微积分是首先被牛顿搞出来的也已经是公认的事实&#xff0c;牛顿在研究物理问题的时候顺带做出来的&#xff0c;不知是舍不得发表还是不屑于发表…

使用gdb调试正在运行的程序

写一个一秒打印一个数的c程序&#xff0c;并编译运行。 #include<unistd.h> #include<stdio.h> int main(int argc,char **argv){int i0;while(1){sleep(1);i;printf("%d\n",i);}return 0; }vim loop.c gcc loop.c -o loop ./loop 查看该进程的进程号。…

基于粒子群算法思想的电动汽车充放电策略-V2G模型-程序代码!

电动汽车充放电对电网的安全稳定带来影响&#xff0c;合理规划电动汽车充放电时间和策略是目前的研究热点。本程序仿真了汽车有序充电和无需充电两种案例&#xff0c;利用电动汽车合理消纳新能源电量&#xff0c;利用粒子群算法思想来求解模型&#xff0c;程序中案例丰富&#…

EasyRecovery2024破解补丁安装包网盘下载

Ontrack EasyRecovery2024是一款功能强大的数据恢复软件&#xff0c;它可以帮助用户从各种存储设备中恢复丢失或删除的数据。它支持多种文件系统和文件类型&#xff0c;可以恢复包括照片、视频、音频、文档、电子邮件和归档文件等不同类型的数据。 Ontrack EasyRecovery 是一款…

matplotlib与opencv图像读取与显示的问题

个人博客:Sekyoro的博客小屋 个人网站:Proanimer的个人网站 最近在用opencv和matplotlib展示图片,但是遇到了一些问题,这里展开说说 首先需要明确的是,opencv和matplotlib读取图片都是通道在最后,而前者默认可见光图像是BGR,后者是RGB.此外还有PIL以及imageio等读取图像的工具…

EasyRecovery14破解版官方软件安装包下载

Ontrack EasyRecovery 是一款功能强大的数据恢复软件&#xff0c;它可以帮助用户从各种存储设备中恢复丢失或删除的数据。它支持多种文件系统和文件类型&#xff0c;可以恢复包括照片、视频、音频、文档、电子邮件和归档文件等不同类型的数据。 Ontrack EasyRecovery 是一款非常…