首页 > 其他分享 >Guava中常用Object方法-equals与null比较、hashCode、自定义toString、自定义compareTo排序

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

时间:2022-11-04 13:55:37浏览次数:88  
标签:name 自定义 Company Object private toString import lombok null

场景

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

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/127683387

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

注:

博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

Objects.equal

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

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

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

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

        System.out.println(Objects.equal(user,user));//true
        System.out.println(Objects.equal(user1,user));//false
        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类为例

package com.ruoyi.demo.guava.basictools;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
    private Company company;
}

如果直接调用其toString

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

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

package com.ruoyi.demo.guava.basictools;

import com.google.common.base.MoreObjects;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
    private String name;
    private int age;
    private Company company;

    @Override
    public String toString() {
        return MoreObjects
                .toStringHelper(this)
                .add("姓名", name)
                .add("年龄", age)
                .add("只需要公司名称", company.getName())
                .toString();
    }

}

此时再输出toString

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

实现Comparable接口,重写compareTo方法

上面用到的Company类

package com.ruoyi.demo.guava.basictools;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Company {
    private String name;
    private String address;
}

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

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

package com.ruoyi.demo.guava.basictools;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Company implements Comparable{
    private String name;
    private String address;


    //在Company类中实现了Comparable接口,因为我想对这个类的对象进行排序。
    // 我已经在compareTo()方法中编写了排序逻辑,我想先按名称排序,如果名称相同,则按地址排序
    @Override
    public int compareTo(Object o) {
        Company company = (Company) o;
        int result = name.compareTo(company.getName());
        if(result!=0){
            return result;
        }
        result = address.compareTo(company.address);
        return result;
    }
}

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

package com.ruoyi.demo.guava.basictools;

import com.google.common.collect.ComparisonChain;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Company implements Comparable{
    private String name;
    private String address;

    //借助Guava ComparisonChain实现Comparable接口可以这样写
    @Override
    public int compareTo(Object o) {
        Company company = (Company) o;
        return ComparisonChain.start()
                .compare(this.name,company.name)
                .compare(this.address,company.address)
                .result();
    }
}

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

 

标签:name,自定义,Company,Object,private,toString,import,lombok,null
From: https://www.cnblogs.com/badaoliumangqizhi/p/16857505.html

相关文章

  • Kotlin-null安全
    null安全是java空指针异常调优方案,kotlin将变量分为Nullable(可为空类型)和Non-Null(不可为空类型)。两种变量声明方式:Non-Nullvara:String="hello"不支持的写法var......
  • ObjectArx多版本编译
    您必须使用Microsoft®VisualStudio®2019版本16.7编译ObjectARX应用程序以在AutoCAD2022 中使用。AutoCAD2022面向.NETFramework4.8,这是Microsoft®VisualS......
  • libmysqlclient.so.18: cannot open shared object file: No such file or directory
    DownloadTypeURLMirrorrepo.mysql.comBinaryPackage​​mysql-community-libs-compat-5.7.26-1.el7.x86_64.rpm​​SourcePackage​​mysql-community-5.7.26-1.el7.src.r......
  • undefined与null的区别,以及数据类型检测
    title:undefined与null的区别,以及数据类型检测的方法1.undefined与null的区别由来,为什么只有JS才有undefined这种数据类型呢JS作者在设计时也是先设计了null,用来表示......
  • Struts2的Action中自定义方法的输入校验
    自定义方法的输入校验对于通过action​的method​属性所指定的自定义方法myExecute​,其对应的自定义输入校验方法名为validateMyExecute​。(底层是通过反射调......
  • Struts2的Action中自定义方法的输入校验
    自定义方法的输入校验对于通过action​的method​属性所指定的自定义方法myExecute​,其对应的自定义输入校验方法名为validateMyExecute​。(底层是通过反射调......
  • qt输出自定义的pdf文件源码详解
    qt中有两种方式可以输出pdf:方式1:使用QPrinter即打印机的方式打印pdf这种方式,在qt4成为唯一的方式。QPrinterprinter(QPrinter::HighResolution);//高清晰度printer.set......
  • 浅谈自定义组件样式覆盖的方式
    简介有时候,基础组件提供的样式不够,需要在不同模块中使用不同的样式,而且差异大到无法通过一两个属性完成。比如组件的颜色,最常见的有三个区域(文字/图标、背景、边框,常用但......
  • C# .NET 获取枚举值的自定义属性(特性)信息
    一、引言枚举为我看日常开发的可读性提供的非常好的支持,但是有时我们需要得到枚举值得描述信息或者是注释(备注)信息比如要获得 TestEmun.aaa属性值得备注AAA,比较不方便得......
  • vue3 leaflet this._map is null,this._map is undefined,listener not found ,cannot
    vue3leafletthis._mapisnull,this._mapisundefined,listenernotfound此类问题这个是vue3的变量深监听所导致的,vue2就没有此类的问题发生解决方法:加toRow()代......