我们一直在使用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(){}
}

现在,我们可以以声明方式重写ToDoItemcompareTo()方法:

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相关推荐

  1. guava api_使用Google Guava的订购API

    guava api 我们在Google的Guava库中玩的更多,这真是一个了不起的库! 我们用于它的最新内容是为我们的域对象整理比较器. 这是如何做. 使用Apache Isis的JDO Object ...

  2. 为什么我不建议你用阿里巴巴Java规范,而使用 Google Guava 编程?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来自 | 张丰哲 链接 | www.jianshu.com ...

  3. 为什么推荐 Java 程序员使用 Google Guava 编程

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 来自 | 张丰哲 链接 | www.jianshu.com/p/97778b21bd00 前言 ...

  4. Google Guava Collections 使用介绍

    原帖http://www.open-open.com/lib/view/open1325143343733.html 简介: Google Guava Collections 是一个对 Java Co ...

  5. [Google Guava] 8-区间

    原文链接 译文链接 译文:沈义扬 范例 1 List scores; 2 Iterable belowMedian =Iterables.filter(scores,Range.lessThan(me ...

  6. [Google Guava] 6-字符串处理:分割,连接,填充

    原文链接 译文链接 译者:沈义扬,校对:丁一 连接器[Joiner] 用分隔符把字符串序列连接起来也可能会遇上不必要的麻烦.如果字符串序列中含有null,那连接操作会更难.Fluent风格的Joine ...

  7. [Google Guava] 1.1-使用和避免null

    原文链接 译文链接 译者: 沈义扬    Doug Lea 说,"Null 真糟糕."   当Sir C. A. R. Hoare 使用了null引用后说,"使用它导致了 ...

  8. [Google Guava] 4-函数式编程

    原文链接 译文链接 译者:沈义扬,校对:丁一 注意事项 截至JDK7,Java中也只能通过笨拙冗长的匿名类来达到近似函数式编程的效果.预计JDK8中会有所改变,但Guava现在就想给JDK5以上用户提 ...

  9. google Guava包的ListenableFuture解析

    原文地址  译者:罗立树  校对:方腾飞 并发编程是一个难题,但是一个强大而简单的抽象可以显著的简化并发的编写.出于这样的考虑,Guava 定义了 ListenableFuture接口并继承了JDK ...

最新文章

  1. 石家庄的联通破网络,请大家鉴定
  2. 使用iText在word文档中插入复杂的Table表格
  3. linux下性能分析命令[总结]
  4. python三维图形旋转_如何在matplotlib中旋转三维曲面
  5. 闲话网名之“jrfly331”
  6. [MySQL 源码] 从buffer pool中获取空闲block流程
  7. 手把手带你爬虫 | 爬取语录大全
  8. neo4j 查询同一节点的两个上级_WhatRoute for Mac(互联网流量诊断查询工具)
  9. 信号与系统 chapter12 卷积及其性质
  10. 电商网站(Django框架)—— 大纲内容与基本功能分析
  11. 【JAVA基础篇】枚举
  12. filter2D函数的.depth()变量的设定
  13. linux控制协程参数,Linux高性能网络:协程系列05-协程实现之原语操作
  14. 设计师 VR 成型设计知识收集
  15. Ansible详解(十五)——Ansible Role实战
  16. html中半圆怎么写,html 中画半圆的方法
  17. Xshell的安装及使用超详细教程
  18. 安装ubuntu黑屏,修复分区表
  19. java 实现扑克牌洗牌功能
  20. 51jiqiren小语种语音机器人

热门文章

  1. 手机打开python文件_使用python在计算机和手机之间通过wifi进行简单的文件传输...
  2. 10人以下小团队管理手册-学习笔记
  3. servlet session 跟踪用户上次访问时间
  4. http长/短轮询和WebSocket 的介绍和比较
  5. 实模式切换到保护模式,为什么要开启A20地址线(系统升级产生的兼容性问题)
  6. 关闭json引用的方式
  7. gradle跟pom_Gradle多项目构建–父pom式结构
  8. apache camel_学习Apache Camel –实时索引推文
  9. svn: 没有演进历程信息_使用默认方法的接口演进–第二部分:接口
  10. 502无法解析服务器标头_编写下载服务器。 第二部分:标头:Last-Modified,ETag和If-None-Match...