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