Guava基于链式风格的比较器

Guava排序器Ordering比较器,它可以用来为构建复杂的比较器,以完成集合排序的功能。从实现上说,Ordering实例就是一个特殊的Comparator实例。Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),并且提供了链式调用方法,来定制和增强现有的比较器。

长话短说,我们来看看Ordering的用法:
Ordering 为我们提供了很多静态方法:

  • Ordering.natural(),自然排序,没有人会陌生,具体使用代码如下:
        Ordering order=Ordering.natural();
        Set set=new TreeSet(order);
        set.add(34);
        set.add(24);
        set.add(45);
        set.add(56);
        set.add(78);
        System.out.println(set);
运行结果:[24, 34, 45, 56, 78]

当然也可以对字符串进行自然排序。

        Ordering order=Ordering.natural();
        Set set=new TreeSet(order);
        set.add("a");
        set.add("bb");
        set.add("bc");
        set.add("c");
        set.add("ab");
        System.out.println(set);
运行结果:[a, ab, bb, bc, c]
  • Ordering.usingToString(),此方法会将对象转化为字符串进行字典排序。
        Ordering order=Ordering.usingToString();
        Set set=new TreeSet(order);
        set.add(1);
        set.add("a");
        set.add("abv");
        set.add("b");
        set.add(3);
        set.add(45);
        set.add("c");
        System.out.println(set);
运行结果:[1, 3, 45, a, abv, b, c]
 
 
  • Ordering.from(Comparator): 将Comparator类型的比较器,转化为Ordering比较器。

  • 当然还有我们比较熟悉的java的一种写法:

 Ordering order=new Ordering() {

            @Override
            public int compare(String left, String right) {
                
                return Ints.compare(right.length(), left.length());
            }
        };

Ordering强大之处是在与他是支持链式风格的。Ordering为我们提供了很多方法,而这些方法都是满足链式调用的。如:reverse()(获得语义相反的比较器),nullsFirst()(使用当前排序器,但额外把null值排到最前面。),nullsLast()(使用当前排序器,但额外把null值放到最后面),onResultOf(Function)(对元素调用Function,再按返回值用当前排序器排序。),等等,这里就不在一一举例了。

//实体类
class Teacher{
    String name;
    int age;
    public Teacher(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Teacher [name=" + name + ", age=" + age + "]";
    }
    
}

测试方法:
   public static void Test05()
    {
        Ordering order=Ordering.natural().nullsLast().onResultOf(new Function() {

            @Override
            public Integer apply(Teacher input) {
            
                 return input.age;
            }
        });
        Set set=new TreeSet(order);
        for(int i=0;i<5;i++)
        {
            set.add(new Teacher("a"+i, 5-i));
        }
        set.add(new Teacher("a123123"+5,100));
        set.add(new Teacher(null, 0));
        System.out.println(set);
    }

运行结果:

[Teacher [name=null, age=0], Teacher [name=a4, age=1], Teacher [name=a3, age=2], Teacher [name=a2, age=3], Teacher [name=a1, age=4], Teacher [name=a0, age=5], Teacher [name=a1231235, age=100]]

注:链式调用的时候,我们应该从右往左开,右边的每一个方法都是为前一个方法提供Ordering对象。

  • Ordering 也为我们提供了一下简单的方法如:max(),min(),等等;
        Ordering order=Ordering.natural();
        System.out.println(order.max("a", "c","d"));
        System.out.println(order.min("s", "z"));

运行结果:

d
s

这里只是比较器的一些初级使用,如果想了解更多Guava比较器的知识,可以看看Ordering的源代码。

你可能感兴趣的:(Guava基于链式风格的比较器)