官网文档: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 } }