`

(转)Guava之Ordering

 
阅读更多
Ordering类提供了一些链式的排序方法,相比JDK自带的排序方法更加简练、方便。
欢迎关注Java技术分享微信公众号:JavaQ
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}
分享到:
评论

相关推荐

    google guava

    Guava的基础模块提供了许多实用工具类,包括但不限于: Predicates(谓词)、Functions(函数)、Optional(可选值)、Ordering(排序)等。它们可以帮助开发者构建更加模块化和可测试的代码,同时减少null指针异常...

    Google-Guava-Collections-使用介绍

    ### Google Guava Collections 使用介绍 #### 一、概述 Google Guava Collections 是 Java Collections Framework 的一个强大且实用的非官方扩展 API。它由 Google 工程师 Kevin Bourrillion 和 Jared Levy 在著名...

    谷歌guava的jar包和源码,值得收藏

    Guava对Java集合框架进行了扩展和优化,提供了如Multiset(多集)、Multimap(多映射)、ImmutableList、ImmutableSet、ImmutableMap等不可变集合,以及Ordering(排序)和Range(范围)等高级数据结构。这些类在...

    guava collection简介1

    6. **Ordering class**:Ordering 类提供了更方便的多关键字排序功能,可以替代使用 Comparator 的复杂代码。 除了以上提到的功能,Guava Collections 还包含许多其他实用工具,如 Predicates、Functions 和 Lists ...

    GuavaGoogle的Java核心库

    1. **集合框架**:Guava对Java集合框架进行了扩展,引入了如Multiset(多集)、Multimap(多映射)、ImmutableList、ImmutableMap和ImmutableSet等不可变集合,以及Ordering(排序)和Range(范围)类。这些集合提供...

    Google_Guava_Collections_使用介绍.pdf )

    自2011年以来,Guava Collections不断更新和完善,成为Java开发者中备受推崇的工具库之一。 #### 二、目标读者与前置知识 Guava Collections的目标读者应当具备基础的Java知识,特别是对JDK5特性的理解和运用能力...

    guava-vs-priorityqueue-benchmark

    使用 Guava Ordering 选择 top-k return Ordering . natural() . leastOf(numbers, k); 使用 PriorityQueue 选择 top-k final PriorityQueue&lt; Integer&gt; queue = new PriorityQueue&lt;&gt; (numbers); List...

    guavstrutsspring

    5. **排序(Ordering)**:Guava的Ordering类提供了一种流畅的Comparator接口,可以方便地创建和组合比较器,进行复杂的数据排序。 6. **异常处理(Throwables)**:简化了异常和错误的处理和传播,例如提供`...

    Java Map 按值排序

    Google的Guava库提供了Ordering类,可以方便地对Map进行排序: ```java Map, Integer&gt; map = new HashMap(); // 添加元素... Map, Integer&gt; sortedByValue = Maps.toMap( map.entrySet().stream(), entry -&gt; ...

    google-collections jar包

    2. **双向映射**:`BiMap`接口提供了双向映射的功能,这意味着对于每个键,都有一个唯一的值与之对应,反之亦然。`HashBiMap`是实现`BiMap`的一个常见选择,可以方便地进行键值之间的相互查找。 3. **过滤映射**:`...

Global site tag (gtag.js) - Google Analytics