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

生活中,最使人疲惫的往往不是道路的遥远,而是心中的郁闷;最使人痛苦的往往不是生活的不幸,而是希望的破灭;最使人颓废的往往不是前途的坎坷,而是自信的丧失;最使人绝望的往往不是挫折的打击,而是心灵的死亡。所以我们要有自己的梦想,让梦想的星光指引着我们走出落漠,走出惆怅,带着我们走进自己的理想。

导读:本篇文章讲解 Guava中常用Object方法-equals与null比较、hashCode、自定义toString、自定义compareTo排序,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

场景

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为空则会报异常

        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();
    }
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135873.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!