Guava中强大的排序器Ordering使用
一 创建排序器
排序器:可以用来为构建复杂的比较器,以完成集合排序的功能:
本质上来说,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使用的更多相关文章
- Java经典类库-Guava中的函数式编程讲解
如果我要新建一个java的项目,那么有两个类库是必备的,一个是junit,另一个是Guava.选择junit,因为我喜欢TDD,喜欢自动化测试.而是用Guava,是因为我喜欢简洁的API.Guava提 ...
- Windbg是windows平台上强大的调试器
基础调试命令 - .dump/.dumpcap/.writemem/!runaway Windbg是windows平台上强大的调试器,它相对于其他常见的IDE集成的调试器有几个重要的优势, Windb ...
- JAVA中GridBagLayout布局管理器应用详解
很多情况下,我们已经不需要通过编写代码来实现一个应用程序的图形界面,而是通过强大的IDE工具通过拖拽辅以简单的事件处理代码即可很轻松的完成.但是我们不得不面对这样操作存在的一些问题,有时候我们希望能够 ...
- SpringMVC中的Interceptor拦截器及与Filter区别
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...
- [UE4]Child Widget中的事件调度器
在Child Widget中新建事件调度器,就会自动在使用该Child Widget的父级界面的事件列表中自动自动出现.功能十分强大.
- 【旧文章搬运】ntfs中的文件名排序规则~
原文发表于百度空间,2011-04-05========================================================================== 在分析nt ...
- 在中间层 .NET 应用程序中通过授权管理器使用基于角色的安全
基于角色的安全是从 Windows NT 的第一个版本开始在 Windows 平台上发展而来的.使用角色,操作系统可以通过检查称为 BUILTIN\Administrators 的组的安全上下文做出一 ...
- 在springboot项目中引入quartz任务调度器。
quartz是一个非常强大的任务调度器.我们可能使用它来管理我们的项目,常见的是做业绩统计等等.当然它的功能远不止这些.我们在这里不介绍quartz的原理,下面讲讲如何在springboot中使用qu ...
- nlp任务中的传统分词器和Bert系列伴生的新分词器tokenizers介绍
layout: blog title: Bert系列伴生的新分词器 date: 2020-04-29 09:31:52 tags: 5 categories: nlp mathjax: true ty ...
随机推荐
- Python3使用Pyintaller-打包成exe
Pyinstaller打包exe执行文件 安装Pyinstaller 使用pip安装Pyinstaller 用管理员模式运行cmd,输入命令: pip install pyinstaller 此方法会 ...
- [工具] Git版本管理(四)(贡献开源代码、git配置、git免密、gitignore)
一.开源项目贡献代码 1.fork项目代码 例如,我们想向tornado框架贡献代码,首先搜索tornado. 然后,将tornado的代码fork到我们的仓库中. 2.clone到本地进行开发 克隆 ...
- Lambda函数到底是个什么
1 什么是Lambda函数 lambda函数是指简单的代码片段,通常认为是不值得命名的函数,它不能重复使用,能方便程序员使用,增强代码可读性,降低代码出错概率. [ 捕获列表 ] (参数) -> ...
- 详解js的bind、call、apply
详解js的bind.call.apply 说明 虽然bind.call.apply都是js很基础的一块知识,但是我从未认真总结过这三者的区别. 由于公司后端是用的微服务架构,又没有中间层对接,导致前端 ...
- FacadePattern(外观模式)-----Java/.Net
外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口.这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性
- Python+appium+unittest UI自动化测试
什么是UI自动化 自动化分层 单元自动化测试,指对软件中最小可测试单元进行检查和验证,一般需要借助单元测试框架,如java的JUnit,python的unittest等 接口自动化测试,主要检查验证模 ...
- OBS Studio 完全开源免费录屏软件
OBS是Open Broadcaster Software的简称,它是一款永久免费的直播软件.OBS直播软件相比XSplit,占用资源相对较少,对配置要求相对要低一点,相同点就是录制格式MP4,不用再 ...
- 8.在python中用data_only=True设置显示excel表格中公式的结果为None的解决方法
在用python调用excel文件显示带公式的表格内容,有两种显示结果:第一种是直接显示表格中公式人内容:另一种是显示其表格中公式的结果. 显示第一种,可以这样输入代码: 显示第二种,可以这样输入代码 ...
- vue项目使用v-charts的柱形图的各种样式和数据配置
找了很多网上关于v-charts的柱形图使用,我发现我一模一样的配置就是没有效果,我原来是按需引入的, import VeHistogram from 'v-charts/lib/histogram' ...
- 用markdown写博客,看这一篇就够了
0. 前言 记得上次用markdown写博客,尽管我有markdown使用经验,但第一篇markdown博客还是不得已的"回滚"了. 传送门:记录一下第一次用markdown写博客 ...