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

    xiaoxiao2021-03-25  188

    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
    转载请注明原文地址: https://ju.6miu.com/read-1931.html

    最新回复(0)