Guava-Ordering使用

前言

在原生Java中,当对不同的类进行比较时,需要让类实现Comparable接口或者Comparator接口,其特别是在基于Hash实现的散列表中非常重要。而Guava实现了Ordering类,可以供开发者更方便地比较不同对象。

Ordering

Ordering实现了Comparator接口,在实现compareequals方法的基础上,增强了多个方法,其可以构造非常复杂的比较器,以便在容器的排序和比较中使用。

示例


package com.hust.grid.leesf.guavalearning;

import com.google.common.base.Function;
import com.google.common.collect.Ordering;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;


public class OrderingTest {

    static class Person {
        private String name;
        private int age;

        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String toString() {
            return "[name = " + name + ", age = " + age + "]";
        }
    }

    public static void main(String[] args) {
        Ordering<Person> ordering = Ordering.natural().onResultOf(new Function<Person, Comparable>() {
            public String apply(Person input) {
                return input.name;
            }
        }).compound(new Comparator<Person>() {
            public int compare(Person o1, Person o2) {
                return o2.age - o1.age;
            }
        });

        Person leesf = new Person("leesf", 25);
        Person leesf1 = new Person("leesf", 26);
        Person dyd = new Person("dyd", 25);
        Person ld = new Person("ld", 25);

        List<Person> persons = new ArrayList<Person>();
        persons.add(leesf);
        persons.add(leesf1);
        persons.add(dyd);
        persons.add(ld);

        System.out.println(ordering.compare(leesf, dyd));
        System.out.println(ordering.max(persons));
        System.out.println(ordering.min(persons));
        List<Person> sortPersons = ordering.sortedCopy(persons);
        System.out.println(sortPersons);
        System.out.println(persons);
    }
}




运行结果:

8 [name = leesf, age = 25]
[name = dyd, age = 25]
[[name = dyd, age = 25], [name = ld, age = 25], [name = leesf, age = 26], [name = leesf, age = 25]]
[[name = leesf, age = 25], [name = leesf, age = 26], [name = dyd, age = 25], [name = ld, age = 25]]

natural方法

当调用natural方法时,返回一个以自然顺序进行排序的比较器NaturalOrdering对象,NaturalOrdering类继承了Ordering<Comparable>,因此,其返回后可以继续调用父类Ordering的方法,形成链式调用。

onResult方法

该方法实现比较的具体逻辑,需要传入Function对象,并实现apply方法添加具体的比较逻辑,在示例中是以Personname属性进行比较。

compound方法

compound方法表示在比较name属性之后,若其相等,则再按照age进行比较。示例中将age大的排序在前面。

总结

Ordering主要是用作比较,组合不同的比较器,可以对集合进行排序,通过sortCopy方法返回的是原始集合的副本,两者互不影响。