ComparisonChain

转载:https://my.oschina.net/realfighter/blog/349824

在日常的工作中,我们经常需要对两个对象进行比较,以找出其中的异同, Java中提供了compare/compareTo,我们需要实现一个比较器[Comparator],或者直接实现Comparable接口,不过当 对象的属性很多的时候,我们需要写大量的if else代码,代码不够优雅,Guava为我们简化了这一点,我们可以使用ComparisonChain类来优雅的实现对象之间的比较,接下来,我们通 过一个实例进行学习。

年纪也不小了,到了相亲的年纪,家里找了两个媒婆:媒婆1和媒婆2,给了钱,媒婆挺办事,都介绍了一个好姑娘,居然还都叫lisa,那么就需要比较一下两个姑娘是不是同一个人了。

我们唯一知道的就是两个姑娘的名字、身高和长相,我们也是通过这三点来进行比较,首先我们构造一个Girl对象,实现Comparable接口,来进行比较,传统方法,我们经常这样做:

class Girl implements Comparable<Girl> {
 
    private String name;//名称
    private double height;//身高
    private String face;//长相
 
    Girl(String name, double height, String face) {
        this.name = name;
        this.height = height;
        this.face = face;
    }
 
    //传统方法我们这样比较
    @Override
    public int compareTo(Girl girl) {
        int c1 = name.compareTo(girl.name);
        if (c1 != 0){
            System.out.println("两个girl的name不相同");
            return c1;
        }
        int c2 = Double.compare(height, girl.height);
        if (c2 != 0){
            System.out.println("两个girl的height不相同");
            return c2;
        }
        int c3 = face.compareTo(girl.face);
        if(c3 !=0)
            System.out.println("两个girl的face不相同");
        return c3;
    }
}

然后,我们测试一下,居然不是一个人,该选择哪一个好呢?

@Test
public void testCompareTo() {
    Girl g1 = new Girl("lisa", 175.00, "nice");
    Girl g2 = new Girl("lisa", 175.00, "beauty");
    //两个girl的face不相同
    System.out.println(g1.compareTo(g2) == 0);//false
}
而使用Guava提供的ComparisonChain类,我们可以这样进行比较,如下:

//使用Guava提供的ComparisonChain我们这样比较

@Override
public int compareTo(Girl girl) {
    return ComparisonChain.start()
            .compare(name, girl.name)
            .compare(height, girl.height)
            .compare(face, girl.face)
            .result();
}

翻开ComparisonChain类的源码,我们发现,它其实是一个抽象类,其提供了主要有三个抽象方法,start()用于返回内部的一个 ComparisonChain实现;重载了许多compare()方法,用于接收各种类型的参数,compare方法返回的仍然是 ComparisonChain对象;result()方法用于返回比较后的结果。

总结:通过对ComparisonChain的学习,以及前面Guava中Obejects实用工具类的学习等,我们发现,Guava中大量存在这种类似的链式编码,熟悉设计模式的不难理解,这正是Builder建造者模式的应用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值