使用Google Guava的订购API
我们一直在使用Google的Guava库做更多的事情-多么出色的库! 我们用于它的最新内容是为我们的域对象整理比较器。 就是这样。 使用Apache Isis的JDO Objectstore ,使您的类实现java.lang.Comparable
,并对集合使用SortedSet
是一个好习惯。 您可以在Isis的quickstart原型中看到这一点,其中ToDoItem
具有递归关系:
public class ToDoItem implements Comparable<ToDoItem> {...private SortedSet<ToDoItem> dependencies = Sets.newTreeSet();...
}
但是,如何最好地实现compareTo
方法? 这是原始的实现:
public int compareTo(final ToDoItem other) {if (isComplete() && !other.isComplete()) {return +1;}if (!isComplete() && other.isComplete()) {return -1;}if (getDueBy() == null && other.getDueBy() != null) {return +1;}if (getDueBy() != null && other.getDueBy() == null) {return -1;}if (getDueBy() == null && other.getDueBy() == null ||getDueBy().equals(this.getDueBy())) {return getDescription().compareTo(other.getDescription());}return getDueBy().compareTo(getDueBy());}
k! 基本上说:
*在尚未完成的对象之前订购尚未完成的对象
*如果有平局,请按截止日期排序(最后将没有截止日期的那些放在最后) *如果有领带,请按描述排序。
这是使用Guava的Ordering
类重写的方法。 首先,让我们为标量类型创建一些Ordering
实例:
public final class Orderings {public static final Ordering<Boolean> BOOLEAN_NULLS_LAST = Ordering.<Boolean>natural().nullsLast();public static final Ordering<LocalDate> LOCAL_DATE_NULLS_LAST = Ordering.<LocalDate>natural().nullsLast();public static final Ordering<String> STRING_NULLS_LAST = Ordering.<String>natural().nullsLast();private Orderings(){}
}
现在,我们可以以声明方式重写ToDoItem
的compareTo()
方法:
public class ToDoItem implements Comparable {...public int compareTo(ToDoItem o) {return ORDERING_BY_COMPLETE.compound(ORDERING_BY_DUE_BY).compound(ORDERING_BY_DESCRIPTION).compare(this, o);}public static Ordering<ToDoItem> ORDERING_BY_COMPLETE = new Ordering<ToDoItem>(){public int compare(ToDoItem p, ToDoItem q) {return Orderings.BOOLEAN_NULLS_LAST.compare(p.isComplete(), q.isComplete());}};public static Ordering<ToDoItem> ORDERING_BY_DUE_BY = new Ordering()<ToDoItem>{public int compare(ToDoItem p, ToDoItem q) {return Orderings.BOOLEAN_NULLS_LAST.compare(p.getDueBy(), q.getDueBy());}};public static Ordering<ToDoItem> ORDERING_BY_DESCRIPTION = new Ordering()<ToDoItem>{public int compare(ToDoItem p, ToDoItem q) {return Orderings.STRINGS_NULLS_LAST.compare(p.getDescription(), q.getDescription());}};
现在,诚然,这几乎不能保证在单个类中仅使用一个方法就可以拥有所有样板。 当然不是! 但是,我们现在拥有的是一个小代数,可以用来在域模型中的所有域类之间进行组合。 使用ToDoItem
其他域类可以使用ToDoItem
的自然排序(从Ordering.natural()
访问)进行Ordering.natural()
,也可以使用各种ToDoItem.ORDERING_BY_xxx
排序来创建新的排序。
参考: Dan Haywood博客博客中使用了我们的JCG合作伙伴 Dan Haywood的Google Guava的Ordering API 。
翻译自: https://www.javacodegeeks.com/2013/02/using-google-guavas-ordering-api.html
使用Google Guava的订购API相关推荐
- guava api_使用Google Guava的订购API
guava api 我们在Google的Guava库中玩的更多,这真是一个了不起的库! 我们用于它的最新内容是为我们的域对象整理比较器. 这是如何做. 使用Apache Isis的JDO Object ...
- 为什么我不建议你用阿里巴巴Java规范,而使用 Google Guava 编程?
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来自 | 张丰哲 链接 | www.jianshu.com ...
- 为什么推荐 Java 程序员使用 Google Guava 编程
点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来自 | 张丰哲 链接 | www.jianshu.com/p/97778b21bd00 前言 ...
- Google Guava Collections 使用介绍
原帖http://www.open-open.com/lib/view/open1325143343733.html 简介: Google Guava Collections 是一个对 Java Co ...
- [Google Guava] 8-区间
原文链接 译文链接 译文:沈义扬 范例 1 List scores; 2 Iterable belowMedian =Iterables.filter(scores,Range.lessThan(me ...
- [Google Guava] 6-字符串处理:分割,连接,填充
原文链接 译文链接 译者:沈义扬,校对:丁一 连接器[Joiner] 用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦.如果字符串序列中含有null,那连接操作会更难.Fluent风格的Joine ...
- [Google Guava] 1.1-使用和避免null
原文链接 译文链接 译者: 沈义扬 Doug Lea 说,"Null 真糟糕." 当Sir C. A. R. Hoare 使用了null引用后说,"使用它导致了 ...
- [Google Guava] 4-函数式编程
原文链接 译文链接 译者:沈义扬,校对:丁一 注意事项 截至JDK7,Java中也只能通过笨拙冗长的匿名类来达到近似函数式编程的效果.预计JDK8中会有所改变,但Guava现在就想给JDK5以上用户提 ...
- google Guava包的ListenableFuture解析
原文地址 译者:罗立树 校对:方腾飞 并发编程是一个难题,但是一个强大而简单的抽象可以显著的简化并发的编写.出于这样的考虑,Guava 定义了 ListenableFuture接口并继承了JDK ...
最新文章
- 石家庄的联通破网络,请大家鉴定
- 使用iText在word文档中插入复杂的Table表格
- linux下性能分析命令[总结]
- python三维图形旋转_如何在matplotlib中旋转三维曲面
- 闲话网名之“jrfly331”
- [MySQL 源码] 从buffer pool中获取空闲block流程
- 手把手带你爬虫 | 爬取语录大全
- neo4j 查询同一节点的两个上级_WhatRoute for Mac(互联网流量诊断查询工具)
- 信号与系统 chapter12 卷积及其性质
- 电商网站(Django框架)—— 大纲内容与基本功能分析
- 【JAVA基础篇】枚举
- filter2D函数的.depth()变量的设定
- linux控制协程参数,Linux高性能网络:协程系列05-协程实现之原语操作
- 设计师 VR 成型设计知识收集
- Ansible详解(十五)——Ansible Role实战
- html中半圆怎么写,html 中画半圆的方法
- Xshell的安装及使用超详细教程
- 安装ubuntu黑屏,修复分区表
- java 实现扑克牌洗牌功能
- 51jiqiren小语种语音机器人
热门文章
- 手机打开python文件_使用python在计算机和手机之间通过wifi进行简单的文件传输...
- 10人以下小团队管理手册-学习笔记
- servlet session 跟踪用户上次访问时间
- http长/短轮询和WebSocket 的介绍和比较
- 实模式切换到保护模式,为什么要开启A20地址线(系统升级产生的兼容性问题)
- 关闭json引用的方式
- gradle跟pom_Gradle多项目构建–父pom式结构
- apache camel_学习Apache Camel –实时索引推文
- svn: 没有演进历程信息_使用默认方法的接口演进–第二部分:接口
- 502无法解析服务器标头_编写下载服务器。 第二部分:标头:Last-Modified,ETag和If-None-Match...