guava学习--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建造者模式的应用。
guava学习--ComparisonChain的更多相关文章
- Guava学习笔记目录
Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concurrency libra ...
- guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁
guava 学习笔记 使用瓜娃(guava)的选择和预判断使代码变得简洁 1,本文翻译自 http://eclipsesource.com/blogs/2012/06/06/cleaner-code- ...
- guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用
guava 学习笔记(二) 瓜娃(guava)的API快速熟悉使用 1,大纲 让我们来熟悉瓜娃,并体验下它的一些API,分成如下几个部分: Introduction Guava Collection ...
- Guava学习
Guava学习笔记目录 Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,包括 collections, caching, primitives support, concu ...
- [置顶] Guava学习之ArrayListMultimap
ArrayListMultimap类的继承关系如下图所示: Guava ArrayListMultimap List Multimap 是一个接口,继承自 Multimap 接口.ListMultim ...
- [置顶] Guava学习之Splitter
Splitter:在Guava官方的解释为:Extracts non-overlapping substrings from an input string, typically by recogni ...
- [置顶] Guava学习之Iterators
Iterators类提供了返回Iterator类型的对象或者对Iterator类型对象操作的方法.除了特别的说明,Iterators类中所有的方法都在Iterables类中有相应的基于Iterable ...
- [置顶] Guava学习之Lists
Lists类主要提供了对List类的子类构造以及操作的静态方法.在Lists类中支持构造ArrayList.LinkedList以及newCopyOnWriteArrayList对象的方法.其中提供了 ...
- [置顶] Guava学习之Immutable集合
Immutable中文意思就是不可变.那为什么需要构建一个不可变的对象?原因有以下几点: 在并发程序中,使用Immutable既保证线程安全性,也大大增强了并发时的效率(跟并发锁方式相比).尤其当一个 ...
随机推荐
- 同一界面放两个TTIWDBAdvWebGrid的问题(delphi IW TMS)
同一个界面放了两个 TTIWDBAdvWebGrid 时,操作一个表,另一个的也跟着一起更改了,后查看网页生成的DIV,发现ID相同. 后查,有一个ID属性,更改后解决问题.
- CAD2008 启动慢 卡住
CAD2008打开很慢解决CAD2008打开很慢的方法: 第一个:1.[开始]―[控制面板]. 2.选择[网络和Internet连接]选项,再点[Internet选项]. 3.在Internet属性对 ...
- NOI 动态规划题集
noi 1996 登山 noi 8780 拦截导弹 noi 4977 怪盗基德的滑翔翼 noi 6045 开餐馆 noi 2718 移动路线 noi 2728 摘花生 noi 2985 数字组合 no ...
- iOS高性能设置圆角
自建一个分类可以设置. -(void)cornerImageWithSize:(CGSize)size fillColor:(UIColor *)fillColor completion:(void( ...
- 【前端】使用readline模块实现Node.js的输入输出
'use strict'; function f(x) { // do something... } var readline = require('readline'); //创建readline接 ...
- How To Install Java on CentOS and Fedora
PostedDecember 4, 2014 453.8kviews JAVA CENTOS FEDORA Introduction This tutorial will show you how ...
- 动态规划(DP)
一.基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移.一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划. 二.基本思想与策略 基本 ...
- 微信,qq,微博如何不用每次清缓存就能看到h5修改过的结果
描述:每次在对js,和css进行修改,想要在微信,微博或则qq里面预览效果,会发现没有生效,那是因为这些客户端会将静态进行缓存,我们需要清理缓存才能看到修改过的效果,但是每次清理缓存会很麻烦,影响开发 ...
- php变量赋值给js
1 2 3 4 5 6 7 8 $(document).ready(function(){ <?php $f="'name'"?> ...
- Arduino 极速入门系列 - 光控灯(1)- 关于理论和 LED 那些事
点个 LED 闪亮好像太单调,这次来个光控 LED 灯.这个其实不需要 Arduino 也能做,这次只是用来演示一下 PWM 在 Arduino 里面的做法.PWM 原理后面会解释.这次用充电宝提供 ...