com.google.common.base.Objects

com.google.common.base.Objects

CommonObjectUtilitiesExplained

cgdecker编辑了这个页面 <relative-time datetime="2017-11-13T18:41:48Z" title="2017年11月14日GMT + 8上午2:41" style="box-sizing: border-box;">on 14 Nov 2017</relative-time> · 6次修订

对象常用方法

等于

当你的对象字段可以null,实现Object.equals可能会很痛苦,因为你必须单独检查null。使用Objects.equal 允许您equals以null敏感的方式执行检查,而不会冒险 NullPointerException

对象。相等(“ a ”,“ a ”); //返回true 
对象。等于(null,“ a ”); //返回false 
对象。等于(“ a ”,null); //返回false 
对象。equal(null,null); //返回true

注意ObjectsJDK 7中新引入的类提供了等效 Objects.equals方法。

的hashCode

哈希的所有字段都Object应该更简单。Guava Objects.hashCode(Object...)为指定的字段序列创建了一个合理的,对顺序敏感的哈希。使用Objects.hashCode(field1, field2, ..., fieldn)而不是手动构建哈希。

注意ObjectsJDK 7中新引入的类提供了等效的 Objects.hash(Object...)

一个好的toString方法在调试中是非常有价值的,但写起来很痛苦。使用MoreObjects.toStringHelper()轻松创建一个有用的toString。一些简单的例子包括:

   //返回“ClassName {x = 1}” 
   MoreObjects 。toStringHelper( this)
       .add(“ x ”,1)
       的ToString();

   //返回“MyObject {x = 1}” 
   MoreObjects 。toStringHelper( “ MyObject ”)
       .add(“ x ”,1)
       的ToString();

比较/的compareTo

直接实现Comparator或实现Comparable接口可能很痛苦。考虑:

class  Person  实现 Comparable < Person > {
   private  String lastName;
  private  String firstName;
  private  int zipCode;

  public  int  compareTo(Person  other){
     int cmp = lastName 。的compareTo(其他。 lastName的);
    if(cmp !=  0){
       return cmp;
    }
    cmp = firstName 。的compareTo(其他。的firstName);
    if(cmp !=  0){
       return cmp;
    }
    返回 整数。比较(邮政编码,其他。邮政编码);
  }
}

这段代码很容易搞砸,很难扫描错误,而且令人不快的冗长。我们应该能够做得更好。

为此,番石榴提供ComparisonChain

ComparisonChain 执行“懒惰”比较:它只执行比较,直到找到非零结果,之后它忽略进一步的输入。

   public  int compareTo(Foo that){
      return  ComparisonChain 。开始()
         .compare(此。 ASTRING,即。 ASTRING)
         .compare(此。 ANINT,即。 ANINT)
         .compare(此。 anEnum,即。 anEnum,订货。自然() 。 nullsLast())
         。结果();
   }
equals() 比较两个对象是否相等
hashCode() 计算hash值

实际使用

@Data

public class SysUser implements Comparable<SysUser> {
    
    private Integer userId;

    private Integer role;

    private String loginName;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        SysUser sysUser = (SysUser) o;
        return Objects.equal(userId, sysUser.userId) &&
                Objects.equal(role, sysUser.role) &&
                Objects.equal(loginName, sysUser.loginName);
    }

    @Override
    public int hashCode() {
        return Objects.hashCode(userId, role, loginName);
    }




    //当前小于后面 -1,小于 1 ,相等 = 0
    @Override
    public int compareTo(SysUser o) {
        return ComparisonChain.start()
                .compare(this.role,o.role)
                .compare(this.loginName,o.loginName)
                .compare(this.userId,o.userId)
                .result();
    }
}


public class Test {


    public static void main(String[] args) {





        List<String> list = Lists.newArrayList();
        list.add("peida");
        list.add("jerry");
        list.add("harry");
        list.add("eva");
        list.add("jhon");
        list.add("neron");


        List<String> list2 = Lists.newArrayList();
        list.add("peida");
        list.add("jerry");
        list.add("harry");
        list.add("eva");
        list.add("jhon");
        list.add("neron");



        SysUser sysUser = new SysUser();
        sysUser.setUserId(1);
        sysUser.setRole(1);
        sysUser.setLoginName("aa");

        SysUser sysUser2 = new SysUser();
        sysUser2.setUserId(1);
        sysUser2.setRole(2);
        sysUser2.setLoginName("aa");

        System.out.println(Objects.equal(sysUser,sysUser2));

        System.out.println(MoreObjects.toStringHelper(sysUser).add("age",10).addValue(1).addValue(2).addValue("ss"));



        System.out.println(sysUser.compareTo(sysUser2));

        System.out.println(sysUser2.compareTo(sysUser));

    }
}


打印结果

false
SysUser{age=10, 1, 2, ss}
-1
1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nier6088

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值