學習使用Guava(基本工具)


  官網文檔:https://github.com/google/guava/wiki

目錄

  一、導入Guava依賴

  二、Objects

  三、Optional

  四、Preconditions

 

 

 

 

 

 

一、導入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
    }
}

  

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM