场景
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