• Guava中常用Object方法-equals与null比较、hashCode、自定义toString、自定义compareTo排序


    场景

    Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验:

    Java核心工具库Guava介绍以及Optional和Preconditions使用进行非空和数据校验_霸道流氓气质的博客-CSDN博客

    在上面引入Guava的基础上,看一下Guava的常用Object方法。

    注:

    博客:
    霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主
    关注公众号
    霸道的程序猿
    获取编程相关电子书、教程推送与免费下载。

    Objects.equal

    当一个对象中的字段可以为null时,实现Object.equals方法需要进行null检查。

    所有的类都默认继承Object,同时继承了equals方法,所以在比较对象是否相等时直接使用a.equals(b)来比较,如果a为空则会报异常

    1.         User user = new User();
    2.         User user1 = null;
    3.         System.out.println(user1.equals(user));//会报异常
    4.         System.out.println(user.equals(user1));//false

    为了避免每次使用if(null!=a)做判断,使用Guava的Objects.equal方法可以避免

    1.         System.out.println(Objects.equal(user,user));//true
    2.         System.out.println(Objects.equal(user1,user));//false
    3.         System.out.println(Objects.equal(null,null));//true

    需要注意的是在JDK7中也提供了一样的方法,所以这里直接可以在Java中使用。

    hashCode

    用对象的所有字段做散列[hash]运算应当更简单。

    Guava的Objects.hashCode会对传入的字段序列计算出合理的、顺序敏感的散列值。

    需要注意的是JDK7中也提供了一样的方法。

    toString

    好的toString方法可以更好的帮助调试,但是编写toString方法却很痛苦。

    使用MoreObjects.toStringHelper方法可以轻松编写有用的toString方法。

    当类没有重写toString方法时会调用object的toString方法

    以一个User类为例

    1. package com.ruoyi.demo.guava.basictools;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. @Data
    6. @AllArgsConstructor
    7. @NoArgsConstructor
    8. public class User {
    9.     private String name;
    10.     private int age;
    11.     private Company company;
    12. }

    如果直接调用其toString

    1.         User user = new User("霸道",50,new Company("公司名","公司地址"));
    2.         System.out.println(user.toString());
    3.         //当类没有重写toString方法时会调用object的toString方法
    4.         //User(name=霸道, age= 50,company=Company(name=公司名, address= 公司地址))

    为了方便调试,重新toString之后

    1. package com.ruoyi.demo.guava.basictools;
    2. import com.google.common.base.MoreObjects;
    3. import lombok.AllArgsConstructor;
    4. import lombok.Data;
    5. import lombok.NoArgsConstructor;
    6. @Data
    7. @AllArgsConstructor
    8. @NoArgsConstructor
    9. public class User {
    10.     private String name;
    11.     private int age;
    12.     private Company company;
    13.     @Override
    14.     public String toString() {
    15.         return MoreObjects
    16.                 .toStringHelper(this)
    17.                 .add("姓名", name)
    18.                 .add("年龄", age)
    19.                 .add("只需要公司名称", company.getName())
    20.                 .toString();
    21.     }
    22. }

    此时再输出toString

    1.         //为了方便调试,重写toString方法之后
    2.         //User{姓名=霸道, 年龄=50, 只需要公司名称= 公司名}

    实现Comparable接口,重写compareTo方法

    上面用到的Company类

    1. package com.ruoyi.demo.guava.basictools;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. @Data
    6. @AllArgsConstructor
    7. @NoArgsConstructor
    8. public class Company {
    9.     private String name;
    10.     private String address;
    11. }

    在此类中实现Comparable接口,因为想对这个类的对象进行排序。

    在comparaTo方法中编写了排序逻辑,想先按名称排序,如果名称相同,则按地址排序。

    1. package com.ruoyi.demo.guava.basictools;
    2. import lombok.AllArgsConstructor;
    3. import lombok.Data;
    4. import lombok.NoArgsConstructor;
    5. @Data
    6. @AllArgsConstructor
    7. @NoArgsConstructor
    8. public class Company implements Comparable{
    9.     private String name;
    10.     private String address;
    11.     //在Company类中实现了Comparable接口,因为我想对这个类的对象进行排序。
    12.     // 我已经在compareTo()方法中编写了排序逻辑,我想先按名称排序,如果名称相同,则按地址排序
    13.     @Override
    14.     public int compareTo(Object o) {
    15.         Company company = (Company) o;
    16.         int result = name.compareTo(company.getName());
    17.         if(result!=0){
    18.             return result;
    19.         }
    20.         result = address.compareTo(company.address);
    21.         return result;
    22.     }
    23. }

    借助Guava的ComparisonChain实现Comparable接口可以这样写

    1. package com.ruoyi.demo.guava.basictools;
    2. import com.google.common.collect.ComparisonChain;
    3. import lombok.AllArgsConstructor;
    4. import lombok.Data;
    5. import lombok.NoArgsConstructor;
    6. @Data
    7. @AllArgsConstructor
    8. @NoArgsConstructor
    9. public class Company implements Comparable{
    10.     private String name;
    11.     private String address;
    12.     //借助Guava ComparisonChain实现Comparable接口可以这样写
    13.     @Override
    14.     public int compareTo(Object o) {
    15.         Company company = (Company) o;
    16.         return ComparisonChain.start()
    17.                 .compare(this.name,company.name)
    18.                 .compare(this.address,company.address)
    19.                 .result();
    20.     }
    21. }

    这种风格的可读性更高,发生错误编码的几率更小,并且能避免做不必要的工作。

  • 相关阅读:
    shiro集成 spring-加密md5配置--权限管理-shiro中的session 等等!!
    Open3D(C++) 最小二乘拟合平面(拉格朗日乘子法)
    【oppenvino】使用docker安装openvino并进行onnx到IR中间件的转化
    对于Biotin-LC-NHS Estercas:72040-63-2与伯氨基 (-NH2) 反应的作用有哪些?
    Mybatis篇
    【AOP系列】6.缓存处理
    Python性能测试框架Locust实战教程!
    【华为OD机试真题 JS】找城市
    论文解读(MaskGAE)《MaskGAE: Masked Graph Modeling Meets Graph Autoencoders》
    php实战案例记录(23)根据数值来判断权限名称的封装函数
  • 原文地址:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127687466