学习使用Guava(基本工具)
2023-09-14 08:56:52 时间
官网文档:https://github.com/google/guava/wiki
目录
二、Objects
三、Optional
一、导入Guava依赖
guava的仓库地址:https://mvnrepository.com/artifact/com.google.guava/guava
<!-- https://mvnrepository.com/artifact/com.google.guava/guava --> <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28.0-jre</version> </dependency>
一、Objects
guava提供了Objects类(com.google.common.base.Objects),这是一个工具类;
从java 7起,jdk有相同的工具类(java.util.Objects),该类比guava的Objects有更多的用法,所以建议直接使用使用jdk提供的Objects类。
下面以java.util.Objects为例
package cn.ganlixin.guava; import org.junit.Test; import java.time.LocalDate; import java.util.Date; import java.util.Objects; public class _Objects { /** * 判断对象是否为null */ @Test public void testNull() { String s = null; // 判断是否为null boolean flag1 = Objects.isNull(s); System.out.println(flag1); // true // 判断是否不为null boolean flag2 = Objects.nonNull(s); System.out.println(flag2); // false } /** * 判断对象是否相等 */ @Test public void testEquals() { // 实际执行(a == b) || (a != null && a.equals(b)) boolean res1 = Objects.equals("hello", "world"); // false boolean res2 = Objects.equals("hello", 1); // false boolean res3 = Objects.equals("hello", "hello"); // true boolean res4 = Objects.equals(1, 1.0); // false } /** * 获取hash值和hashCode值 */ @Test public void testHash() { int h1 = Objects.hashCode("hello"); // 99162322 // 实际调用obj != null ? obj.hashCode() : 0 // 求hash结果,可以多参数 int h2 = Objects.hash("hello"); // 99162353 int h3 = Objects.hash("hello", "world"); // -1107615551 } /** * requiredNoNull,必须不为null,否则抛出异常 */ @Test public void testRequireNonNull() { Date date = null; // data为null时,抛出异常NullPointerException Date date1 = Objects.requireNonNull(date); Date date2 = Objects.requireNonNull(date, "date为空(这是抛出的异常msg)"); // java.lang.NullPointerException: date为空(这是抛出的异常msg) // date为null是,执行指定操作,操作中返回字符串,作为异常信息提示 Date date3 = Objects.requireNonNull(date, () -> { System.out.println("hello"); return "yes"; }); //hello //java.lang.NullPointerException: yes } /** * toString方法,打印对象 */ @Test public void testToStringWithDefault() { String date1 = Objects.toString(LocalDate.now()); System.out.println(date1); // 2019-11-01 // 注意,此时比较特殊 String date2 = Objects.toString(null); System.out.println(date2 + " " + date2.length()); // null 4 String date3 = Objects.toString(LocalDate.now(), "1990-09-01"); System.out.println(date3); // 2019-11-01 String date4 = Objects.toString(null, "2000-01-01"); System.out.println(date4); // 2000-01-01 String date5 = Objects.toString(null, null); System.out.println(date5 + " " + date5.length()); // java.lang.NullPointerException } /** * 比较对象 */ @Test public void testCompare() { String s1 = "hello"; String s2 = "world"; int res1 = Objects.compare(s1, s2, (o1, o2) -> { if (s1.length() < s2.length()) { return -1; } else if (s1.length() == s2.length()) { return 0; } else { return 1; } }); int[] arr1 = {1, 2, 3}; int[] arr2 = {4, 5, 6}; int res2 = Objects.compare(arr1, arr2, (o1, o2) -> { // 自定义比较规则 return -1; }); } }
三、Optional
对于Java来说,经常出现NPE(NullPointerException,空指针异常)在程序当中,如果在比较重要的逻辑当中出现空指针异常,可能会导致业务受影响,所以一般程序中会有很多的Objects.isNull的判断。
Guava中有这么一种用法,和Objects.isNull的功能类似,就是Optional类:
同样地,从Java8开始,也提供了一个Optional类(java.util.Optional),用法和Guava的Optional几乎一样。
下面以java.util.Optional为例:
package cn.ganlixin.guava; import org.junit.Test; import java.time.LocalDate; import java.util.Optional; public class _Optional { /** * Optional.of()方法,不能接受null */ @Test public void testOf() { LocalDate date = null; Optional<LocalDate> opt1 = Optional.of(date); // 是否符合预期(不为null),如果date不为null,则返回true if (opt1.isPresent()) { // opt1.get() 获取date System.out.println(opt1.get()); } else { System.out.println("date is null"); } // 抛出异常:java.lang.NullPointerException String str = "hello"; Optional<String> opt2 = Optional.of(str); if (opt2.isPresent()) { System.out.println(opt2.get()); } else { System.out.println("str is null"); } // 输出 hello } /** * Optional.ofNullable() 可以接受null */ @Test public void testOfNullable() { LocalDate date = null; Optional<LocalDate> opt1 = Optional.ofNullable(date); // 是否符合预期(不为null),如果date不为null,则返回true if (opt1.isPresent()) { // opt1.get() 获取date System.out.println(opt1.get()); } else { System.out.println("date is null"); } // 不会抛出异常 // date is null String str = "hello"; Optional<String> opt2 = Optional.ofNullable(str); if (opt2.isPresent()) { System.out.println(opt2.get()); } else { System.out.println("str is null"); } // 输出 hello } /** * 判断是否返回默认值,以及执行其他操作 */ @Test public void testElse() { String str = "hello"; String sNull = null; String res = null; String defaultVal = "default value"; Optional<String> opt1 = Optional.ofNullable(str); if (opt1.isPresent()) { res = opt1.get(); } else { res = defaultVal; } System.out.println(res); // hello // 上面等价于 res = Optional.ofNullable(str).orElse(defaultVal); System.out.println(res); // hello res = Optional.ofNullable(sNull).orElse(defaultVal); System.out.println(res); // default value res = Optional.ofNullable(str).orElseGet(() -> { System.out.println("如果str为null,那么就会执行这部分代码"); return "return Val"; }); System.out.println(res); // hello } }
四、Preconditions
Preconditions(先决条件),类似与单元测试中的断言。
package cn.ganlixin.guava; import com.google.common.base.Preconditions; import org.junit.Test; import java.util.Objects; public class UsePreconditions { @Test public void testCheck() { String argNull = null; Preconditions.checkArgument(Objects.nonNull(argNull)); // 抛出异常:java.lang.IllegalArgumentException Preconditions.checkArgument(Objects.nonNull(argNull), "参数不能为空"); // 抛出异常:java.lang.IllegalArgumentException: 参数不能为空 Preconditions.checkNotNull(argNull); // 抛出异常:java.lang.NullPointerException Preconditions.checkNotNull(argNull, "对象不能为null"); // 抛出异常:java.lang.NullPointerException: 对象不能为null } }
相关文章
- Android性能调优工具TraceView介绍
- PDMan 数据库建模工具
- 2022制定每日学习计划并提醒的待办工具
- 前端常用60余种工具方法(下)
- JVM深入学习笔记五:JVM 监控工具
- Tools - 虚拟环境构建工具Vagrant
- Lucene5学习之LuceneUtils工具类简单封装
- RHCE学习<14>熟悉Bash常用文本处理工具用法
- python工具——Seaborn
- python私有工具库小结
- Git - 管道工具(Git plumbing tool)
- [工具类]DataTable与泛型集合List互转
- golang应用性能异常诊断方案及主流诊断工具holmes
- CodeShine for Visual Basic 6 独特强大的重构工具
- AI之AutoML:Ludwig(无需编写代码/易于使用的界面和可视化自动机器学习工具)的简介、安装、使用方法之详细攻略
- 硬核提效工具!发现5个应该立即开始学习的Python库
- 学习、工具网站
- Java学习路线-38:集合工具类Stack栈、Queue队列、Properties、Collections、Stream、MapReduce
- C++ Primer 学习笔记_95_用于大型程序的工具 --多重继承与虚继承
- C++ Primer 学习笔记_91_用于大型程序的工具 --命名空间
- 猿创征文|为什么我在日常开发中偏爱这几款工具?
- JUC学习之共享模型工具之JUC并发工具包下
- JUC学习之共享模型之工具上之线程池浅学
- Web版 PK 客户端SQL工具,谁代表未来趋势?
- python工具方法 31 通过导入自定义dll实现显存释放