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

      

     

  • 相关阅读:
    开始用博客
    nginx 移动端和PC端相互访问
    call、apply、bind的区别
    获取两个日期之间的所有日期组合
    高频前端开发问题
    图片懒加载实现
    某某公司中级前端面试题
    flex 布局
    plupload.js+php批量上传文件到阿里云oss
    H5 iframe 高度-根据内容的高度自适应 / iframe高度适配
  • 原文地址:https://www.cnblogs.com/-beyond/p/12008837.html
Copyright © 2020-2023  润新知