Optional类使用总结

1.1、Optional类介绍

在我们平常开发过程中,如果程序逻辑考虑不全,就有可能导致空指针异常NullPointerException,也就是我们常说的NPE

出现空指针异常的根本原因,就是我们在使用某个对象的时候,没有判断这个对象是否可以为null,如果这个对象为null,那么在调用其对应方法的时候,就会抛出空指针异常。

在JDK1.7之前,我们可能都是通过如下代码来进行空指针的判断,代码如下所示:

public static void main(String[] args) {String obj = null;// 判空校验if (obj == null) {throw new RuntimeException("obj对象不能为空");}
}

但是,从JDK1.8开始,就专门提供了一个处理NPE异常的类,即:【Optional】类。

  • Optional是一个位于【java.util】包下的类,该类被【final】修饰。
  • Optional是一个泛型类,即:可以处理不同数据类型。
  • Optional不能直接进行实例化操作,因为它的构造方法是private修饰的。

下面具体介绍一下Optional类的使用方法。

1.2、Optional属性和方法

(1)value属性

Optional类就是判断某个对象是否为空的,所以为了保存那个对象,Optional类中通过一个泛型value维护需要判断NPE的对象。

private final T value;

(2)私有构造方法

Optional可以理解为是一个处理NPE异常的工具类,所以它不需要被外部进行实例化操作,所以Optional类没有对外提供构造方法,它只有两个private修饰的构造方法。

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

(3)empty()方法

如果我们要创建一个value等于null的Optional对象,此时可以调用Optional类的【empty()】方法。

private static final Optional<?> EMPTY = new Optional<>();public static<T> Optional<T> empty() {@SuppressWarnings("unchecked")Optional<T> t = (Optional<T>) EMPTY;return t;
}

(4)of()方法

通过Optional类的【of()】方法,可以创建一个指定value的Optional对象。

public static <T> Optional<T> of(T value) {return new Optional<>(value);
}

注意:如果传递的【value】对象等于null,那么调用【of()】方法的时候,就会抛出NullPointerException异常。

(5)ofNullable()方法

【ofNullable()】方法和【of()】方法类似,两者唯一的区别就是:

  • 【of()】方法当指定的【value】等于null时候,抛出NPE异常。
  • 【ofNullable()】方法当指定的【value】等于null时候,此时会返回一个空的Optional对象,而不会抛出异常。
public static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);
}

(6)get()方法

get() 方法用于获取Optional对象中的【value】值。如果value等于null,那么此时会抛出【NoSuchElementException】异常。

public T get() {if (value == null) {throw new NoSuchElementException("No value present");}return value;
}

(7)orElse()方法

orElse() 方法用于获取value值,如果获取的value值等于null,那么此时会采用【orElse()】方法指定的参数值作为返回值。

public T orElse(T other) {return value != null ? value : other;
}

(8)orElseGet()方法

【orElseGet()】方法和【orElse()】方法作用类似,只不过【orElseGet()】方法的参数是一个函数式接口类型Supplier,我们在使用【orElseGet()】方法的时候,就可以采用lambada表达式语法。

public T orElseGet(Supplier<? extends T> other) {return value != null ? value : other.get();
}

(9)orElseThrow()方法

orElseThrow() 方法和orElseGet() 方法作用类似,orElseThrow() 方法的参数也是一个函数式接口类型Supplier,只不过它需要返回一个Throwable类型的值。

public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {if (value != null) {return value;} else {throw exceptionSupplier.get();}
}

(10)isPresent ()方法

isPresent() 方法作用是判断value值是否存在,即:value值是否为null,如果value等于null,则返回false,否则返回true。

PS:present英文单词含义是:【存在】。

public boolean isPresent() {return value != null;
}

(11)ifPresent()方法

ifPresent() 方法作用:如果value值不等于null,则调用具体的消费者方法使用value值,否则不做任何处理。

【ifPresent()】方法没有返回值,并且该方法需要传递一个【Consumer】类型的对象。

public void ifPresent(Consumer<? super T> consumer) {if (value != null)consumer.accept(value);
}

(12)filter()方法

filter() 方法作用:过滤value值,如果value满足过滤的条件,则返回value值,否则返回一个空的Optional对象。

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

(13)map()方法

map() 方法作用:如果value值等于null,则返回一个空的Optional对象,否则通过Function对象进行value值的运算,并将运行结果作为新的Optional对象返回。

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

(14)flatMap()方法

flatMap() 方法作用:如果value值等于null,则返回一个空的Optional对象,否则将一个二维的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));}
}

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

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

相关文章

全网关键词采集,免费关键词采集软件使用方法

网站的SEO优化已经成为企业提升在线可见性的不二选择。而关键词的选择和使用则是SEO优化的核心。本文将专心分享关键词采集的正确用法&#xff0c;助您在SEO的道路上掌握正确的方向。 关键词采集&#xff1a;SEO的基础 让我们明确关键词采集的重要性。在搜索引擎的世界里&…

Python生产者消费者模型

额滴名片儿 &#x1f388; 博主&#xff1a;一只程序猿子 &#x1f388; 博客主页&#xff1a;一只程序猿子 博客主页 &#x1f388; 个人介绍&#xff1a;爱好(bushi)编程&#xff01; &#x1f388; 创作不易&#xff1a;如喜欢麻烦您点个&#x1f44d;或者点个⭐&#xff01…

【tower-boot 系列】redis集成

redis 介绍 Redis是一种支持key-value等多种数据结构的存储系统。可用于缓存&#xff0c;事件发布或订阅&#xff0c;高速队列等场景。支持网络&#xff0c;提供字符串&#xff0c;哈希&#xff0c;列表&#xff0c;队列&#xff0c;集合结构直接存取&#xff0c;基于内存&…

leetcode:468. 验证IP地址

验证IP地址 中等 249 相关企业 给定一个字符串 queryIP。如果是有效的 IPv4 地址&#xff0c;返回 “IPv4” &#xff1b;如果是有效的 IPv6 地址&#xff0c;返回 “IPv6” &#xff1b;如果不是上述类型的 IP 地址&#xff0c;返回 “Neither” 。 有效的IPv4地址 是 “x1.x…

【蓝桥杯选拔赛真题73】Scratch烟花特效 少儿编程scratch图形化编程 蓝桥杯创意编程选拔赛真题解析

目录 scratch烟花特效 一、题目要求 编程实现 二、案例分析 1、角色分析

组件的props属性

目录 1&#xff1a;使用props的作用&#xff1a; 2&#xff1a;props自定义属性的用法&#xff1a; 3&#xff1a;集合v-bind使用自定义属性&#xff1a; 4&#xff1a;props自定义属性是只读的&#xff1a; 5&#xff1a;default默认值&#xff1a; 6&#xff1a;type值类…

ffmpeg 同时采集麦克风和摄像头并录制文件

命令 ffmpeg -f dshow -i video"Integrated Webcam" -f dshow -i audio"麦克风 (Realtek(R) Audio)" -vcodec libx264 -acodec mp3 1.mkv ffmpeg -f dshow -i video"Integrated Webcam" -f dshow -i audio"麦克风 (Realtek(R) Audio)&qu…

LeetCode哈希表:最长和谐子序列

LeetCode:哈希表&#xff1a;最长和谐子序列 题目描述 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在&#xff0c;给你一个整数数组 nums &#xff0c;请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的子序列是一个由数组派生出来的…

(Python) 特殊变量

整体 内置模块 name 用到的模块 对象 函数

掌握视频剪辑技巧:批量置入视频封面,提升视频品质

在当今数字化时代&#xff0c;视频已成为生活的重要组成部分。无论是观看电影、电视剧、综艺节目&#xff0c;还是分享个人生活、工作成果&#xff0c;视频都以其独特的魅力吸引着大众的视线。视频封面是视频内容的缩影&#xff0c;是观众对视频的第一印象。一个好的封面能吸引…

C语言面试之旅:掌握基础,探索深度(面试实战之c语言指针数组下篇)

没有什么人能一路单纯到底&#xff0c;但是要记住&#xff0c;别忘了最初的自己。 ----小新 一、引言 在C语言中&#xff0c;指针是一种特殊的数据类型&#xff0c;它存储的是内存地址。指针在C语言编程中扮演着重要的角色&#xff0c;能够有效地提高程序的效率和灵活性。理解…

ArrayList 与 顺序表 (附洗牌算法)!

曾经我也是一枚学霸&#xff0c;直到有一天想去学渣的世界看看&#xff0c;结果就找不到回去的路了。 目录 1. 线性表 2.顺序表 2.1 接口的实现 3. ArrayList简介 4. ArrayList使用 4.1 ArrayList的构造 4.2 ArrayList常见操作 4.3 ArrayList的遍历 4.4 ArrayList的扩…

Redis连接池参数过期策略慢查询日志

目录 bigKey bigKey危害 bigKey优化 连接池参数 删除策略 慢查询日志 redis.config配置 命令配置 showlog命令 bigKey bigKey危害 Redis阻塞,bigKey操作一般耗时久,Redis单线程, 其他客户端会排队等待网络拥堵,bigKey意味着每次获取需要很大流量, 假设单条数据1MB,并发…

[在不同进制下的长除法] 正整数的任意进制转换

正整数的任意进制转换 题目描述 将 p 进制 n 转换为 q 进制。p 和 q 的取值范围为【2&#xff0c;36】&#xff0c;其中&#xff0c;用到的数码按从小到大依次为&#xff1a;0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&…

Flutter PK jetpack compose区别和选择

Flutter诞生于Chrome团队&#xff0c;是一帮做Web的开发做的跨平台框架&#xff0c;从最开始的设计初衷&#xff0c;就是指向了跨平台这条路&#xff0c;而Compose&#xff0c;则是诞生于Android团队&#xff0c;是为了解决当前View的架构体系不能再继续适应申明式编程的范式而…

使用drawio图表,在团队中,做计划,设计和跟踪项目

使用drawio图表&#xff0c;在团队中&#xff0c;做计划&#xff0c;设计和跟踪项目 drawio是一款强大的图表绘制软件&#xff0c;支持在线云端版本以及windows, macOS, linux安装版。 如果想在线直接使用&#xff0c;则直接输入网址draw.io或者使用drawon(桌案), drawon.cn内部…

Redis中分布式锁的使用

在分布式系统中&#xff0c;如果使用JVM中的同步锁在高并发的场景下仍然会产生线程安全问题。首先我们来查看在多个服务器时为什么会产生线程安全问题&#xff0c;有这样一个案例&#xff0c;有一件商品购买规则为一个用户只能购买一次&#xff0c;如果使用同步锁锁住用户id&am…

AR助推制造业智能转型:实时远程协作与可视化引领生产创新

制造商面临着多方面的变革&#xff0c;技术的兴起催生了工业物联网&#xff08;IIoT&#xff09;&#xff0c;改变了现代工厂的外貌、系统和流程。同时&#xff0c;全球竞争压力和不断变化的员工队伍要求采用新的员工培训方法&#xff0c;并重新审视工人在工厂中的角色。尽管如…

Linux(13):例行性工作排程

例行性工程 听谓的排程是将工作安排执行的流程之意。 Linux 排程就是透过 crontab 与 at 这两个东西。 两种工作排程的方式&#xff1a; 一种是例行性的&#xff0c;就是每隔一定的周期要来办的事项&#xff1b; 一种是突发性的&#xff0c;就是这次做完以后就没有的那一种&a…

【算法】希尔排序

目录 1. 说明2. 举个例子3. java代码示例4. java示例截图 1. 说明 1.希尔排序是直接插入排序的一种改进&#xff0c;其本质是一种分组插入排序 2.希尔排序采取了分组排序的方式 3.把待排序的数据元素序列按一定间隔进行分组&#xff0c;然后对每个分组进行直接插入排序 4.随着间…