Guava学习(五):ComparisonChain(比较链)
主要作用是帮助我们实现对象的比较(如果对象有多个字段,我们希望比较的时候是根据多个字段来比较的),没用这个之前我们通常这样写:
class Person implements Comparable {
private String lastName;
private String firstName;
private int zipCode;
public int compareTo(Person other) {
int cmp = lastName.compareTo(other.lastName);
if (cmp != 0) {
return cmp;
}
cmp = firstName.compareTo(other.firstName);
if (cmp != 0) {
return cmp;
}
return Integer.compare(zipCode, other.zipCode);
}
}
上面的代码太琐碎,不够优雅,使用ComparisonChain后就能帮助我们解决这个痛点了。话不多说,上代码。
Person类
package com.bluedragon.guavalearning.comparisonchain;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Ordering;
/**
* @author CodeRush
* @date 2019/7/27 23:58
*/
public class Person implements Comparable<Person> {
private String name;
private Integer age;
private Gender gender;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Gender getGender() {
return gender;
}
public void setGender(Gender gender) {
this.gender = gender;
}
@Override
public int compareTo(Person that) {
//ComparisonChain执行一种懒比较: 它执行比较操作直至发现非零的结果, 在那之后的比较输入将被忽略,相对于下面的比较简单明了多了
return ComparisonChain.start()
.compare(this.name, that.name, Ordering.natural().nullsFirst())
.compare(this.age, that.age)
.compare(this.gender, that.gender)
.result();
}
// class Person implements Comparable {
// private String lastName;
// private String firstName;
// private int zipCode;
// public int compareTo(Person other) {
// int cmp = lastName.compareTo(other.lastName);
// if (cmp != 0) {
// return cmp;
// }
// cmp = firstName.compareTo(other.firstName);
// if (cmp != 0) {
// return cmp;
// }
// return Integer.compare(zipCode, other.zipCode);
// }
// }
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", gender=" + gender +
'}';
}
/**
* 性别枚举
*/
public enum Gender {
MAN,
WOMAN
}
}
测试类
package com.bluedragon.guavalearning.comparisonchain;
import com.google.common.collect.Lists;
import java.util.ArrayList;
/**
* @author CodeRush
* @date 2019/7/27 23:57
*/
public class ComparisonChainTest {
public static void main(String[] args) {
Person p1 = new Person();
p1.setName("zs");
p1.setAge(18);
p1.setGender(Person.Gender.WOMAN);
Person p2 = new Person();
p2.setName("zs");
p2.setAge(18);
p2.setGender(Person.Gender.MAN);
Person p3 = new Person();
p3.setAge(18);
p3.setGender(Person.Gender.MAN);
Person p4 = new Person();
p4.setName("zs");
p4.setAge(20);
p4.setGender(Person.Gender.MAN);
ArrayList<Person> people = Lists.newArrayList(p1, p2, p3, p4);
//使用ComparisonChain实现的compareTo方法排序集合
people.sort(Person::compareTo);
people.forEach(System.out::println);
}
}
1万+



被折叠的 条评论
为什么被折叠?



