官網文檔: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
}
}
