学习使用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
    }
}