设为首页 收藏本站
查看: 662|回复: 0

[经验分享] Apache Commons 项目运用

[复制链接]

尚未签到

发表于 2017-1-8 08:12:22 | 显示全部楼层 |阅读模式
相对的 comparable另一个有趣的方法也有一个相当正式的契约,那就是 Comparable 接口的 compareTo 方法。如果要控制特定的对象如何排序,那么这个接口非常重要。在本节中,您将学习如何利用 Commons Lang 的 CompareToBuilder。排序输出在过去的 Java 编程中您可能已经注意到,对于对象如何按一定的顺序排序有默认的机制,例如 Collections 类的 sort 方法。例如,例 15 中的 Collection 未经排序,如果不对它做任何事情,那么这个顺序将一直维持下去:例 15. 一个 String 列表ArrayList<String> list = new ArrayList<String>();list.add("Megan");list.add("Zeek");list.add("Andy");list.add("Michelle");然而,如果像例 16 中那样将 list 传递给 Collections 的 sort 方法,那么将应用默认的排序,在这里是按字母顺序。例 16 将例 15 中的名称列表按字母顺序排序,并打印出排序后的结果:例 16. 对 String 列表排序Collections.sort(list);for(String value : list){System.out.println("sorted is " + value);}例 17 显示输出:例 17. 排序后的 String 列表sorted is Andysorted is Megansorted is Michellesorted is Zeek当然,这样之所以行得通,是因为 Java String 类实现了 Comparable 接口,因此有 compareTo 方法的一个实现,该方法允许按字母顺序排序。实际上,Java 语言中几乎所有的核心类都实现这个接口。如果您想允许按不同的方式对一个 Account 集合进行排序 — 例如按 id 或 last name,应该怎么做呢?当然,首先必须实现 Comparable 接口,然后实现 compareTo 方法。这个方法实际上只能用于自然排序 — 根据对象的属性对对象排序。因此,compareTo 非常类似于 equals 方法,只是通过它可以将一个集合的 Account 按它们的属性排序,排序的顺序与使用 compareTo 方法处理属性的顺序相同。如果阅读用于实现该方法的文档,您将发现,它非常类似于 equals;也就是说,要正确地实现它比较棘手。(Effective Java 花了 4 页的篇幅讨论这个专题)。到现在,您很可能已经想出这样的模式:利用 Commons Lang。回页首构建 compareToCommons Lang 提供一个 CompareToBuilder 类,它的功能与 EqualsBuilder 几乎一样。它包括一个可链接的 append 方法,最终可以通过 toComparison 方法返回一个 int。因此,首先必须修改 Account 类,以实现 Comparable 接口,如例 18 所示:例 18. 实现 Comparable 接口public class Account implements Comparable {}接下来,必须实现 compareTo 方法,如例 19 所示:例 19. compareTo 的默认实现public int compareTo(Object obj) {return 0;}实现这个方法需要分两步。首先,必须将传入的参数的类型转换为需要的类型(在这里是 Account)。然后,利用 CompareToBuilder 比较对象的属性。Commons Lang 文档表明,应该像 equals 方法中那样比较相同的属性;因此,Account 对象的 compareTo 方法看上去应该如例 20 所示:例 20. 使用 CompareToBuilder public int compareTo(Object obj) {Account account = (Account) obj;return new CompareToBuilder()。append(this.id, account.id).append(this.firstName, account.firstName).append(this.lastName, account.lastName).append(this.emailAddress, account.emailAddress).append(this.creationDate, account.creationDate).toComparison();}别忘了,如果您真的想减少自己编写的代码,那么可以总是利用反射风格的 CompareToBuilder API,如例 21 所示:例 21. 使用 CompareToBuilder 的反射 APIpublic int compareTo(Object obj) {return CompareToBuilder.reflectionCompare(this, obj);}现在,如果需要依赖用于一个 Account 集合的自然排序,那么可以利用 Collections.sort,如例 22 所示:例 22. 为一个可比较的 Account 的列表排序Date now = new Date();ArrayList<Account> list = new ArrayList<Account>();list.add(new Account(41, "Amy", "Glover", "ajg@me.com", now));list.add(new Account(10, "Andrew", "Glover", "ajg@me.com", now));list.add(new Account(1, "Andrew", "Blover", "ajg@me.com", new Date()));list.add(new Account(2, "Andrew", "Smith", "b@bb.com", now));list.add(new Account(0, "Andrew", "Glover", "z@zell.com", new Date()));Collections.sort(list);for(Account acct : list){System.out.println(acct);}这段代码先后根据 id、first name 和 last name 等属性以自然顺序输出对象。因此,排序后的顺序如例 23 所示:例 23. 排序后的 Account 列表new Account(0, "Andrew", "Glover", "z@zell.com", new Date())new Account(1, "Andrew", "Blover", "ajg@me.com", new Date())new Account(2, "Andrew", "Smith", "b@bb.com", now)new Account(10, "Andrew", "Glover", "ajg@me.com", now)new Account(41, "Amy", "Glover", "ajg@me.com", now)这种输出的作用则是另一回事。在下一节中,您将看到 Commons Lang 如何帮助您构建可读性更强的结果。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-325303-1-1.html 上篇帖子: apache mina 学习(三)-----Mina架构 下篇帖子: Apache Commons 项目运用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表