【Java8】Guava——Object方法和排序

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值