一 创建排序器

 排序器:可以用来为构建复杂的比较器,以完成集合排序的功能:
本质上来说,Ordering 实例无非就是一个特殊的Comparator 实例。
Ordering把很多基于Comparator的静态方法(如Collections.max)包装为自己的实例方法(非静态方法),
并且提供了链式调用方法,来定制和增强现有的比较器
    //创建排序器
@Test
public void createOreing(){
//对可排序类型做自然排序,如数字按大小,日期按先后排序
Ordering<Comparable> natural = Ordering.natural();
//按对象的字符串形式做字典排序
Ordering.usingToString();
//把给定的Comparator转化为排序器或者继承Ordering实现自定义排序器
Ordering<Integer> from = Ordering.from((Integer x, Integer y) -> Ints.compare(x, y));
System.out.println(from.max(5, 6));
}

二 扩展排序器,变换成其他功能排序器

    //衍生其他排序器
@Test
public void anotherOreing(){
Ordering<Comparable> natural = Ordering.natural();
natural.max(1, 2); //2
//获取语义相反的排序器
natural.reverse().max(1, 2); //
List<Integer> list = Lists.newArrayList(5, 9, 3, 7, 4);
Collections.sort(list,natural.nullsFirst()); //使用排序器对集合排序
list.forEach(x-> System.out.print(x+", ")); //3, 4, 5, 7, 9 // 不使用这两个排序器,排序元素不能为null,否则会报空指针
natural.nullsFirst();//使用当前排序器,并把null值排到最前
natural.nullsLast();//使用当前排序器,并把null值排到最后 natural.compound(natural);//合成另一个比较器,以处理当前排序器中的相等情况,即添加第二个比较器 //onResultOf:将function应用在各个元素上之后, 在使用原始ordering进行排序
Collections.sort(list,natural.onResultOf(x->x*(-1)));//元素变为负数再排序
list.forEach(x-> System.out.print(x+", ")); //9, 7, 5, 4, 3
}

三 使用排序器

    //使用排序器
@Test
public void operOrdering(){
Ordering<Comparable> natural = Ordering.natural();
List<Integer> list02 = Lists.newArrayList(6,4,9,3,1,5,3);
/**
* greatestOf: 获取可迭代对象中最大的k个元素,并按从大到小排序,返回一个集合
* leastOfL获取最小的几个,并按从小到大排序
*/
natural.greatestOf(list02,1).forEach(x-> System.out.println(x)); //
natural.leastOf(list02,1).forEach(x-> System.out.println(x)); //1
//返回集合的一个排好序的副本
natural.sortedCopy(list02);
natural.immutableSortedCopy(list02); //返回不可变的排序副本
/**
* isOrdered: 判断是否已经按排序器有序,元素不能少于2,允许有相等元素
* isStrictlyOrdered: 是否严格排序,不允许有相等元素
*/
Collections.sort(list02,natural);
natural.isOrdered(list02);//true
natural.isStrictlyOrdered(list02); //false
//其他直接比较元素
natural.compare(1,2);natural.max(5,6);natural.min(list02);
}

Guava中强大的排序器Ordering使用的更多相关文章

  1. Java经典类库-Guava中的函数式编程讲解

    如果我要新建一个java的项目,那么有两个类库是必备的,一个是junit,另一个是Guava.选择junit,因为我喜欢TDD,喜欢自动化测试.而是用Guava,是因为我喜欢简洁的API.Guava提 ...

  2. Windbg是windows平台上强大的调试器

    基础调试命令 - .dump/.dumpcap/.writemem/!runaway Windbg是windows平台上强大的调试器,它相对于其他常见的IDE集成的调试器有几个重要的优势, Windb ...

  3. JAVA中GridBagLayout布局管理器应用详解

    很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够 ...

  4. SpringMVC中的Interceptor拦截器及与Filter区别

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  5. [UE4]Child Widget中的事件调度器

    在Child Widget中新建事件调度器,就会自动在使用该Child Widget的父级界面的事件列表中自动自动出现.功能十分强大.

  6. 【旧文章搬运】ntfs中的文件名排序规则~

    原文发表于百度空间,2011-04-05========================================================================== 在分析nt ...

  7. 在中间层 .NET 应用程序中通过授权管理器使用基于角色的安全

    基于角色的安全是从 Windows NT 的第一个版本开始在 Windows 平台上发展而来的.使用角色,操作系统可以通过检查称为 BUILTIN\Administrators 的组的安全上下文做出一 ...

  8. 在springboot项目中引入quartz任务调度器。

    quartz是一个非常强大的任务调度器.我们可能使用它来管理我们的项目,常见的是做业绩统计等等.当然它的功能远不止这些.我们在这里不介绍quartz的原理,下面讲讲如何在springboot中使用qu ...

  9. nlp任务中的传统分词器和Bert系列伴生的新分词器tokenizers介绍

    layout: blog title: Bert系列伴生的新分词器 date: 2020-04-29 09:31:52 tags: 5 categories: nlp mathjax: true ty ...

随机推荐

  1. 在加权无向图上求出一条从1号结点到N号结点的路径,使路径上第K+1大的边权尽量小

    二分+最短路算法 #include<cstdio> #include<iostream> #include<cstring> #include<algorit ...

  2. 用Robot Framework+python来测试基于socket通讯的C/S系统(网络游戏)

    项目终于换了方案,改用socket来实现而不是之前的http了,所以测试工具就不能用以前的了,因为测试人手少,逼不得已的必须要挖掘更多的自动化方案来弥补.于是先研究了下python的socket解决方 ...

  3. 我的面试标准:1.能干活;2.Java基础好;3.熟悉分布式框架

    本文授权转载自:https://www.cnblogs.com/JavaArchitect/p/10011253.html . awesome-java:https://github.com/Snai ...

  4. spring整合springMVC、mybatis、shiro

    jar包: <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding& ...

  5. 洛谷$P$1402 酒店之王 网络流

    正解:网络流 解题报告: 传送门! 一看就很网络流昂,,,于是现在的问题就变成怎么建图了$QwQ$ 首先如果只有一个要求,那就直接按要求建图然后跑个最大流就好. 现在变成,有两个要求,必须同时满足,考 ...

  6. 超详细Node安装教程

    今天周末休息,我制定了我的2020年度规划,其中包含编写50篇养成写博文的习惯.算下来平均每周一篇,感觉也不是很难,但我的写作能力不是很好,争取一次比一次好!希望自己能够坚持下去.2020为自己而活, ...

  7. js获取当前农历时间

    <template> <div class="gaia-header"> <img alt="gaia_logo" src=&qu ...

  8. 初识python——知其名而去其意

    ---背景 b2b,房地产,人工智能是今年最火的词汇,那么配套的软件技术究竟是怎样的呢,通过百度,园子里的信息分析,自我感觉需要用python来进行数据采集. ---环境 在百度,qq群的大神指导下, ...

  9. Java工作流系统-父子流程的配置讲解

    父子流程 关键字: 驰骋工作流程快速开发平台 工作流程管理系统 工作流引擎 asp.net工作流引擎 java工作流引擎. 开发者表单  拖拽式表单 工作流系统 适配数据库: oralce,mysql ...

  10. Linux下Qt+CUDA调试并运行

    Qt与CUDA相结合具体的操作主要修改qt项目中的配置文件pro.下面以测试的项目为例. 因为这是一个测试案例,代码很简单,下面将这几个文件的代码贴出来,方面后面对应pro文件和Makefile文件中 ...