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

news/2024/11/16 18:31:04/

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.ppmy.cn/news/190467.html

相关文章

JAVA网络编程(一)

一、什么是网络编程 定义&#xff1a;在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景&#xff1a;即时通信&#xff0c;网游&#xff0c;邮件等 不管什么场景&#xff0c;都是计算机与计算机之间通过网络在进行数据传输 java提供一…

Rust 笔记:Rust 语言中的枚举

Rust 笔记 Rust 语言中的枚举 作者&#xff1a;李俊才 &#xff08;jcLee95&#xff09;&#xff1a;https://blog.csdn.net/qq_28550263?spm1001.2101.3001.5343 邮箱 &#xff1a;291148484163.com 本文地址&#xff1a;https://blog.csdn.net/qq_28550263/article/details/…

一个简易的多GPU服务器监控程序

前言 因为实验室有很多台 GPU 服务器&#xff0c;每次要运行代码都要一台一台跑上去看GPU有没有人用&#xff0c;所以就写了一个这种小程序。 https://github.com/rikonaka/watchcorgi效果图 curl http://127.0.0.1:7070/info >> 2023-06-03 12:01:31 [watchcorgi] --…

python: zip 和unzip用法

a [1, 2] b [1, 3] zipped zip(a, b) zipped <zip at 0xa857448> list(zipped) [(1, 1), (2, 3)] c, d zip(*zip(a, b)) c, d list(c), list(d) ([1, 2], [1, 3])

zipfile.BadZipFile: File is not a zip file

zipfile.BadZipFile: File is not a zip file的问题复现步骤&#xff1a; 使用openpyxl的save函数&#xff0c;将数据保存在Excel文件中。在没有保存完成的情况下&#xff0c;又使用load_workbook函数加载该Excel文件。 解决方法&#xff1a;在执行完save前&#xff0c;不要使…

”拒绝访问,压缩包无法解压,压缩文件zipped无法创建指定的目录“的解决方法

电脑重装系统之后偶然间解压缩的时候提示拒绝访问&#xff0c;无法创建指定的目录。 分析应该是权限的问题&#xff0c;然后尝试给目标文件夹添加当前账户的控制许可&#xff0c;如下图&#xff1a; 再次解压即可完成。 原因应该是重装系统之后新的账户和原系统的硬盘文件之间的…

zip与zip(*)

zip创建一个聚合了来自每个可迭代对象中元素的迭代器。 zip返回一个元组的迭代器&#xff0c;其中的第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。 当所输入可迭代对象中最短的一个被耗尽时&#xff0c;迭代器将停止迭代。 zip*相当于zip的逆操作&#xff08;…

python zip(*zipped)的疑问

zipped zip([one, two, three], [1, 2, 3]) print(zipped) print(list(zipped)) print(zipped) letter, number zip(*zipped) # *将元组解压为列表&#xff0c;返回二维矩阵&#xff0c;再打包为元组&#xff0c;拆包为两个变量 print("num_zip: ", letter, numbe…