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
guava api