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