【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(Optional篇)

news2024/11/24 15:26:00

Guava相关的介绍

在这里插入图片描述

Guava工程包含了许多被Google的Java项目广泛依赖的核心库。我们希望通过本文档为Guava中最流行和最强大的功能提供更具可读性和解释性的说明。

本教程是中级教程,适合 Guava 中级开发者的进阶学习。

学习Guava前的准备工作

  1. 学习目标和计划:在学习Guava技术之前,您需要明确自己的学习目标和计划。例如,您希望学习Guava的哪些功能,需要掌握哪些知识点,以及在什么时间内完成学习任务等。

  2. 学习工具:为了更好地学习Guava技术,您需要选择适合自己的学习工具。例如,您可以使用Eclipse、IntelliJ IDEA等集成开发环境(IDE)来编写和调试Java代码,使用Maven或Gradle等构建工具来管理项目依赖。

  3. 参考资料:在学习Guava技术之前,您需要收集相关的学习资料。例如,您可以阅读Guava官方文档、参考书籍、博客文章、视频教程等。

使用Guava工具的实战意义

很多 Guava 工具类对 Null 值都采用快速失败操作,除非工具类本身提供了针对 Null 值的因变措施。此外,Guava 还提供了很多工具类,让你更方便地用特定值替换 Null 值。

使用Optional除了赋予null 语义,增加了可读性,最大的优点在于它是一种傻瓜式的防护。Optional 迫使你积极思考引用缺失的情况,因为你必须显式地从 Optional 获取引用。直接使用 null 很容易让人忘掉某些情形,尽管 FindBugs 可以帮助查找 null 相关的问题,但是我们还是认为它并不能准确地定位问题根源。

使用Optional 的意义在哪儿?

使用Optional的最大优点是除了赋予null语义,还增加了代码的可读性。此外,它还是一种傻瓜式的防护,因为Optional迫使你积极思考引用缺失的情况,你必须显式地从Optional获取引用。相比之下,直接使用null很容易让人忘掉某些情形,尽管FindBugs等工具可以帮助查找null相关的问题,但它们并不能准确地定位问题根源。

在方法的返回值中,也可能存在null的情况。就像你自己实现的方法method(a,b)可能会返回null一样,其他人编写的方法也可能会返回null。为了避免这种情况,我们可以将方法的返回类型指定为Optional,这样就可以迫使调用者思考返回的引用缺失的情形。这样一来,你就不会忘记别人写的方法method(a,b)会返回null,就像你自己实现method(a,b)时可能会忘记输入参数a可以为null一样。

具体案例

建议您在使用Set时避免使用null,或者将null作为Map的键值。使用特殊值来代表null可以让查找操作的语义更加清晰。如果您想在Map中使用null作为某个键的值,建议您不要将这个条目放到Map中,而是单独维护一个"值为null的键集合"(null keys)。在Map中,对应某个键的值是null和没有对应某个键的值是非常容易混淆的两种情况。因此,最好将值为null的键分离开,并且仔细思考null值的键在您的项目中到底表达了什么语义。

如果您需要在列表中使用null,并且这个列表的数据是稀疏的,建议您使用Map<Integer, E>,这可能会更高效,并且更准确地符合您的潜在需求。

此外,建议您考虑使用自然的null对象——特殊值。例如,为某个枚举类型增加特殊的枚举值表示null,比如java.math.RoundingMode中定义的枚举值UNNECESSARY,它表示一种不做任何舍入操作的模式,使用这种模式进行舍入操作会直接抛出异常。

使用更优秀的集合功能

如果您真的需要使用null值,但是null值不能与Guava中的集合实现一起工作,那么建议您选择其他实现。例如,您可以使用JDK中的Collections.unmodifiableList来替代Guava的ImmutableList。

Optional的使用介绍

大多数情况下,开发人员使用 null 表明的是某种缺失情形:可能是已经有一个默认值,或没有值,或找不到值。例如,Map.get 返回 null 就表示找不到给定键对应的值。

Optional的引用类型

Guava用Optional表示可能为 null 的 T 类型引用。

一个Optional 实例可能包含非 null 的引用(我们称之为引用存在),也可能什么也不包括(称之为引用缺失)。它从不说包含的是 null 值,而是用存在或缺失来表示。但Optional 从不会包含 null 值引用。

Optional<Integer> possible = Optional.of(5);
possible.isPresent(); // returns true
possible.get(); // returns 5

Optional无意直接模拟其他编程环境中的”可选” or “可能”语义,但它们的确有相似之处。Optional 最常用的一些操作被罗列如下:

创建 Optional 实例(静态方法)

  • Optional.of(T) :创建指定引用的 Optional 实例,若引用为 null 则快速失败。
  • Optional.absent():创建引用缺失的 Optional 实例。
  • Optional.fromNullable(T):创建指定引用的 Optional 实例,若引用为 null 则表示缺失。

Optional实例查询引用(非静态方法)

  • boolean isPresent():如果 Optional 包含非 null 的引用(引用存在),返回true
  • T get():返回Optional包含的引用,若引用缺失,则抛出 java.lang.IllegalStateException
  • T or(T):返回Optional包含的引用,若引用缺失,返回指定的值。
  • T orNull():返回Optional所包含的引用,若引用缺失,返回 null
  • Set asSet():返回Optional所包含引用的单例不可变集,如果引用存在,返回一个只有单一元素的集合,如果引用缺失,返回一个空集合。

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

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

相关文章

Python学习笔记 - 探索集合Set

尊敬的各位&#xff0c;我是Mr.数据杨&#xff0c;非常高兴和你们一起走进Python的世界。今天&#xff0c;让我们一起探讨Python中神奇的“集合”。你们是否读过《三国演义》&#xff1f;你们应该记得那场赫赫有名的“桃园三结义”吧&#xff1f;那让我们以此为例&#xff0c;来…

Windows动态链接库的生成和使用

工程需要&#xff0c;最近在编一组Windows上的动态链接库给Python调用。之前做过Linux下C动态库的编译&#xff0c;并提供给Python调用&#xff0c;Windows下的编译跟Linux还是有些差距&#xff0c;因此花了一点时间跑通&#xff0c;在这里记录一下。 为了完整对比&#xff0c…

Hive on Spark环境搭建

Hive 引擎简介 Hive 引擎包括&#xff1a;默认 MR、tez、spark 最底层的引擎就是MR &#xff08;Mapreduce&#xff09;无需配置&#xff0c;Hive运行自带 Hive on Spark&#xff1a;Hive 既作为存储元数据又负责 SQL 的解析优化&#xff0c;语法是 HQL 语法&#xff0c;执行…

(2.54mm)TSM-120-04-S-DV-P-TR方形接线柱针脚、ADRF5545ABCPZN(通用)射频前端 SPDT

TSM-120-04-S-DV-P-TR (2.54mm) 表面安装.025"方形接线柱针脚是板对板连接器&#xff0c;有单排、双排或三排方形接线柱端子可供选择&#xff0c;带直通、直角或混合技术引脚。这些高度可靠的坚固针脚有垂直和水平两种方向&#xff0c;在混合气流 (MFG) 环境中可使用10年。…

【C语言实现简易ATM】上个C语言程序设计课,我成产品经理了?

博主简介&#xff1a;Hello大家好呀&#xff0c;我是陈童学&#xff0c;一个与你一样正在慢慢前行的人。 博主主页&#xff1a;陈童学哦 所属专栏&#xff1a;C语言程序设计实验项目 如果本文对你有所帮助的话&#xff0c;还希望可以点赞&#x1f44d;收藏&#x1f4c2;支持一下…

2023年京东618满300减50是全品类吗?满减叠卷怎么用?

2023年京东618满300减50是全品类吗?满减叠卷怎么用? 京东平台上有着比较多的卖家开店&#xff0c;在对店铺进行运营的过程中&#xff0c;很多卖家都会参与平台的一些活动&#xff0c;这样能够有效的将产品推广出去&#xff0c;对于618大促活动也是属于其中活动之一&#xff0…

代码随想录第52天

1.最长递增子序列 接下来&#xff0c;我们依然用动规五部曲来详细分析一波&#xff1a; dp[i]的定义 本题中&#xff0c;正确定义dp数组的含义十分重要。 dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 为什么一定表示 “以nums[i]结尾的最长递增子序” &…

软考A计划-电子商务设计师-专业英语

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分享&am…

高压侧电流检测电路及仿真

高压侧电流检测电路仿真 电路图如下 主要设计思想&#xff0c;通过两组电阻将高压侧的共模电压降到运放&#xff08;此处也可以使用单电源运放&#xff09;的工作电压范围内。然后在进行二次放大。主要放大倍数取决于第二级放大侧电阻比值。因此如果需要减小功耗&#xff0c;可…

JAVA数组基础

目录 一、使用方式 1-动态初始化 ①先声明数组 ② 创建数组 ③分配方式 二、使用方式 2-静态初始化&#xff08;直接在声明的同时初始化{ } &#xff09; 三、数组使用注意事项和细节 四、数组两种初始化方式都是将内存空间分配到堆上面的 一、使用方式 1-动态初始化 …

助力金融科技创新 同创永益受邀参加2023 INNO CHINA中国产业创新大会

2023 INNO CHINA中国产业创新大会-金融科技创新论坛于2023年5月10日在北京大学中关村新园召开。本次金融科技创新论坛由北大创新评论主办&#xff0c;同创永益受邀参加。来自银行、保险、证券等金融行业的多位专家、学者齐聚大会现场&#xff0c;共同探讨金融科技发展新趋势、金…

复合型人才

一、为什么需要复合型人才 在社会的大环境影响下&#xff0c;不同行业所展现的交叉属性越来越强&#xff0c;因此单一型人才已经不满足当前的企业需求&#xff0c;复合型人才逐渐成为市场上的主流&#xff1a;即不仅要“精”通&#xff0c;更要“全”面。 人才需求是由市场的…

长尾词挖掘,如何选择精准的长尾词优化?

长尾词的挖掘也是一门大学问&#xff0c;它存在多种不同的方法。最常用的方法是把关键词直接放搜索引擎的搜索框搜索和使用长尾词挖掘工具这两种。 以运动水壶为例。 关键词直接放搜索引擎的搜索框搜索&#xff0c;结果如下&#xff1a; 使用长尾词挖掘工具&#xff0c;…

【C++笔记总结】面向对象编程——封装 |C++

文章目录 前言一、类的封装1.1、公有&#xff0c;私有&#xff0c;保护1.2、类的定义和类的实现相分离1.3、构造函数&#xff0c;析构函数&#xff0c;拷贝构造函数1.4、静态数据成员和静态成员函数1.5、友元函数&#xff0c;友元类 二、类的实现——对象2.1、对象的静态分配&a…

【SpringCloud——Elasticsearch(中)】

一、DSL查询语法以及整合JAVA代码使用 以下操作案例均基于上篇的hotel索引库及其数据进行。 1、查询基本语法 GET /indexName/_search {"query": {"查询类型":{"查询条件":"条件值"}} } 2、查询所有 2.1、DSL语句 #查询所有 GET …

Java并发编程面试题——线程池

目录 1.什么是线程池&#xff1f;有什么优缺点&#xff1f;2.创建线程池的方式有哪些&#xff1f;2.1.通过 Executor 框架的工具类 Executors 来创建不同类型的线程池2.2.使用 ThreadPoolExecutor 类自定义线程池2.3.注意事项 3.自定义线程池时有哪些参数&#xff1f;它们各有说…

笔试强训 Day 7

选择题&#xff1a; 1.在&#xff08;&#xff09;情况下适宜采用 inline 定义内联函数 A 函数体含有循环语句 B 函数体含有递归语句C 函数代码少、频繁调用 D 函数代码多&#xff0c;不常调用 复习一下内联函数 在编译阶段&#xff0c;会将内联函数展开 —— 将函数调用替换成…

四、若依(前后端分离)项目构建docker 镜像

若依(前后端分离&#xff09;项目构建docker 镜像 1. 构建好ruoyi-admin.jar包&#xff0c;上传到服务器项目目录下 2. 创建conf目录将若依项目&#xff08;Spring boot &#xff09;配置文件修改好&#xff0c;上传存入conf目录 注意&#xff1a;这里的地址不能写127.0.0.1和…

ur5在gazebo中仿真的官方源码浅析

一 复现 好久之前初学rosgazebo机械臂仿真的时候总有些懵&#xff0c;用的是ur5机械臂&#xff0c;现在回过头来看好像看懂了一些&#xff0c;故重新理清了一下功能包的逻辑&#xff0c;方便查阅。 官方源码 本文参考 ubuntu16.04安装UR3/UR5/UR10机械臂的ROS驱动并实现gazebo…

chatgpt赋能python:Python列表从后往前遍历

Python列表从后往前遍历 作为一门广泛应用于数据科学、机器学习和Web开发的高级编程语言&#xff0c;Python为开发人员和科学家们提供了很多便利。在Python里面&#xff0c;列表是一种非常常见的数据结构&#xff0c;它允许开发人员存储和处理多个元素。但是&#xff0c;有时候…