Guava之Ordering

原创 2016年06月01日 21:09:29
Ordering类提供了一些链式的排序方法,相比JDK自带的排序方法更加简练、方便。

Ordering中有3种静态方法用于创建Ordering排序器:

根据上面的方法创建Ordering后,可以继续调用如下方法创建组合功能的排序器:

创建完Ordering排序器后,即可使用它对集合或元素进行操作


下面介绍常用方法的使用。
以下示例代码中使用到的People类包含name和age两个属性。
1.natural方法
该方法使用自然排序规则生成排序器,如从小到大、日期先后顺序。使用这个方法之前先介绍一下onResultOf 方法,这个方法接收一个Function函数,该函数的返回值可以用于natural方法排序的依据,即根据这个返回值来进行自然排序,示例代码如下:
@Test
public void testNatural() {
    List<People> peopleList = new ArrayList<People>() {{
        add(new People("A", 33));
        add(new People("B", 11));
        add(new People("C", 18));
    }};
 
    Ordering<People> ordering = Ordering.natural().onResultOf(new Function<People, Comparable>() {
        @Override
        public Comparable apply(People people) {
            return people.getAge();
        }
    });
 
    for (People p : ordering.sortedCopy(peopleList)) {
        System.out.println(MoreObjects.toStringHelper(p)
                        .add("name", p.getName())
                        .add("age", p.getAge())
        );
    }
}

 sortedCopy方法会使用创建的排序器排序并生成一个新的List。对于Ordering.natural().onResultOf方法,阅读顺序是从后往前,即根据onResultOf 方法的返回值按照自然规则创建一个Ordering,然后调用sortedCopy方法排序并生成新List。输出结果如下:
People{name=B, age=11}
People{name=C, age=18}
People{name=A, age=33}
2.reverse方法
这个方法使用反向的排序规则来排序,即若使用natural规则创建Ordering后,再接着调用reverse方法,则按照自然规则的反向,从大到小的规则排序,示例代码如下:
@Test
public void testReverse() {
    List<People> peopleList = new ArrayList<People>() {{
        add(new People("A", 33));
        add(new People("B", 11));
        add(new People("C", 18));
    }};
 
    Ordering<People> ordering = Ordering.natural().reverse().onResultOf(new Function<People, Comparable>() {
        @Override
        public Comparable apply(People people) {
            return people.getAge();
        }
    });
 
    for (People p : ordering.sortedCopy(peopleList)) {
        System.out.println(MoreObjects.toStringHelper(p)
                        .add("name", p.getName())
                        .add("age", p.getAge())
        );
    }
}
输入结果如下:
People{name=A, age=33}
People{name=C, age=18}
People{name=B, age=11}
 3.usingToString方法
该方法创建Ordering,并根据排序依据值的toString方法值来使用natural规则排序,示例代码如下:
@Test
public void testUsingToString() {
    List<People> peopleList = new ArrayList<People>() {{
        add(new People("A", 33));
        add(new People("B", 11));
        add(new People("C", 18));
    }};
 
    Ordering<People> ordering = Ordering.usingToString().onResultOf(new Function<People, Comparable>() {
        @Override
        public Comparable apply(People people) {
            return people.getName();
        }
    });
 
    for (People p : ordering.sortedCopy(peopleList)) {
        System.out.println(MoreObjects.toStringHelper(p)
                        .add("name", p.getName())
                        .add("age", p.getAge())
        );
    }
}
输入结果如下:
People{name=A, age=33}
People{name=B, age=11}
People{name=C, age=18}
同时使用usingToString和reverse方法示例代码如下:
@Test
public void testUsingToStringAndReverse() {
    List<People> peopleList = new ArrayList<People>() {{
        add(new People("A", 33));
        add(new People("B", 11));
        add(new People("C", 18));
    }};
 
    Ordering<People> ordering = Ordering.usingToString().reverse().onResultOf(new Function<People, Comparable>() {
        @Override
        public Comparable apply(People people) {
            return people.getName();
        }
    });
 
    for (People p : ordering.sortedCopy(peopleList)) {
        System.out.println(MoreObjects.toStringHelper(p)
                        .add("name", p.getName())
                        .add("age", p.getAge())
        );
    }
}
输出结果如下:
People{name=C, age=18}
People{name=B, age=11}
People{name=A, age=33}
4.from方法
该方法接收一个自定义的Comparator比较器来创建Ordering,根据Comparator中的自定义规则排序,示例代码如下:
@Test
public void testFrom() {
    List<People> peopleList = new ArrayList<People>() {{
        add(new People("A", 33));
        add(new People("B", 11));
        add(new People("C", 18));
    }};
 
    Ordering<People> ordering = Ordering.from(new Comparator<People>() {
        @Override
        public int compare(People o1, People o2) {
            return o1.getAge() - o2.getAge();
        }
    });
 
    for (People p : ordering.sortedCopy(peopleList)) {
        System.out.println(MoreObjects.toStringHelper(p)
                        .add("name", p.getName())
                        .add("age", p.getAge())
        );
    }
}
输出结果如下:
People{name=B, age=11}
People{name=C, age=18}
People{name=A, age=33}
同时使用from和reverse方法,示例代码如下:
@Test
public void testFromAndReverse() {
    List<People> peopleList = new ArrayList<People>() {{
        add(new People("A", 33));
        add(new People("B", 11));
        add(new People("C", 18));
    }};
 
    Ordering<People> ordering = Ordering.from(new Comparator<People>() {
        @Override
        public int compare(People o1, People o2) {
            return o1.getAge() - o2.getAge();
        }
    }).reverse();
 
    for (People p : ordering.sortedCopy(peopleList)) {
        System.out.println(MoreObjects.toStringHelper(p)
                        .add("name", p.getName())
                        .add("age", p.getAge())
        );
    }
}
输出结果如下:
People{name=A, age=33}
People{name=C, age=18}
People{name=B, age=11}


欢迎关注Java技术分享微信公众号:JavaQ



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Google Guava 工具集__3__ Ordering犀利的比较器 Object方法

Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强。它非常容易扩展,可以轻松构造复杂的comparator,然后用在...

Guava学习笔记-Collection

Guava 集合学习笔记
  • unei66
  • unei66
  • 2015年02月11日 23:01
  • 9791

Google Guava学习(3)-Guava Ordering类

1. 功能:排序 2. 代码: package com.example.google.guava.demo.clazz; import com.google.common.collect.Ord...

Guava ---- Ordering排序工具

使用Guava的排序工具类, 快速实现对象的单变量排序和多变量排序, 让你的开发效率爆炸......

Google-Guava学习:排序器Ordering

排序器[Ordering]是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。从实现上说,Ordering实例就是一个特殊的Comparato...

Guava(三):流畅的排序

今天我们来看一下Guava的排序,正好可以和我们之前的Java排序进行对比,我们可以看看到底Guava使怎样的将排序做到流畅。。。      首先我们要知道Guava中的排序器是Ordering,顾名...

Google Guava学习之Ordering

Guava的Ordering和JDK Comparator相比功能更强。它非常容易扩展,可以轻松构造复杂的comparator,然后用在容器的比较、排序等操作中。以下是一个代码实例。import ja...

Guava collections -- Ordering

这次主要介绍是的是com.google.common.collect.Ordering.Ordering是一个比较器,通过额外的方法来支持常见的操作。这是一个Java“丰富”版本的Comparator...

Guava(瓜娃)学习笔记

Guava(瓜娃)学习笔记 Guava工程包含了若干被google的java项目广泛依赖的核心库,例如:集合 [collections] 、缓存 [caching] 、原生类型支持 [primitiv...

Java-类库-Guava-Ordering比较器

Ordering是Guava类库提供的一个犀利强大的比较器工具,Guava的Ordering和JDK Comparator相比功能更强。它非常容易扩展,可以轻松构造复杂的comparator,然后用在...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Guava之Ordering
举报原因:
原因补充:

(最多只允许输入30个字)