Objects
Equal
String str = "test";
Objects.equal(str,null) //return false
Objects.equal(null,str) //return false
Objects.equal(str,"test") //return true
Objects.equal(null,null) //return true
HashCode
对传入的字段序列计算出合理的、顺序敏感的散列值
Objects.hashCode(field1,field2,field3...)
toString
//return ClassName{x=1}
Objects.toStringHelper(this).add("x", 1).toString();
//return MyClass{x=1}
Objects.toStringHelper("MyClass").add("x", 1).toString();
Guava排序器——“流畅风格比较器”
从实现上说,Ordering实例就是一个特殊的Comparator实例。Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器
创建排序器
官方排序
natural() //对可排序类型做自然排序,如数字按大小,日期按先后排序
usingToString() //按对象的字符串形式做字典排序
from(Comparator) //把给定的Comparator转化为排序器
自定义排序
//直接继承Ordering
Ordering<String> strLenthSort = new Ordering<String>() {
public int compare(String left, String right) {
return Ints.compare(left.length(), right.length());
}
};
链式调用方法
通过链式调用,可以由给定的排序器衍生出其它排序器
reverse() //获取语义相反的排序器
nullsFirst() //使用当前排序器,但额外把null值排到最前面
nullsLast() //使用当前排序器,但额外把null值排到最后面
compound(Comparator) //合成另一个比较器,以处理当前排序器中的相等情况
lexicographical() //基于处理类型T的排序器,返回该类型的可迭代对象Iterable<T>的排序器
onResultOf(Function) //对集合中元素调用Function,再按返回值用当前排序器排序
//需要下面这个类的排序器
class MyObject{
@Nullable String sorted;
int notSortedBy;
}
//考虑到排序器应该能处理sortedBy为null的情况
Ordering<MyObject> ordering =
Ordering
.natural() //自然排序
.nullsFirst() //空值优先
.onResultOf(
new Function<MyObject, String>() {
public String apply(MyObject foo) {
return foo.sorted;
}
});
注:链式调用产生的排序器时,应该从后往前读。
排序器首先调用apply方法获取sorted值,并把sorted为null的元素都放到最前面,然后把剩下的元素按sorted进行自然排序。之所以要从后往前读,是因为每次链式调用都是用后面的方法包装了前面的排序器
注:用compound方法包装排序器时,就不应遵循从后往前读的原则。为了避免理解上的混乱,请不要把compound写在一长串链式调用的中间,你可以另起一行,在链中最先或最后调用compound。
运用排序器
Guava的排序器实现有若干操纵集合或元素值的API
greatestOf(Iterable iterable, int k) //获取可迭代对象中最大的k个元素
isOrdered(Iterable) //判断可迭代对象是否已按排序器排序:允许有排序值相等的元素。
sortedCopy(Iterable)//判断可迭代对象是否已严格按排序器排序:不允许排序值相等的元素
greatestOf(Iterable iterable, int k)//获取可迭代对象中最大的k个元素
isOrdered(Iterable) //判断可迭代对象是否已按排序器排序:允许有排序值相等的元素
sortedCopy(Iterable)//判断可迭代对象是否已严格按排序器排序:不允许排序值相等的元素
min(E, E) //返回两个参数中最小的那个。如果相等,则返回第一个参数
min(E, E, E, E...)//返回多个参数中最小的那个。如果有超过一个参数都最小,则返回第一个最小的参数
min(Iterable) //返回迭代器中最小的元素。如果可迭代对象中没有元素,则抛出NoSuchElementException