JAVA像SQL一样对List对象集合进行排序
作者:字母哥博客 时间:2023-11-01 12:36:24
在开始之前,我先卖个关子提一个问题:假设我们有一个Movie类,这个类有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分)。你知道怎么对一个Movie对象组成的List集合,先按照是否收藏字段倒序排序,再按照评分的倒序进行排序么?如果您不知道4行代码以内的解决方案(其实是1行代码就可以实现,但笔者格式化为4行),我觉得您有必要一步步的看下去。
在java 8 之前,实现对象Collection排序,集合中被排序和比较大小的对象得实现Comparable接口。在java 8之后,有了Comparator比较器的概念,使用Comparator完成对象数组的排序更加方便快捷,下面就给大家简单的介绍一下java 8中使用Comparator排序的方法。
一、字符串List排序
cities是一个字符串数组。注意london的首字母是小写的。
当使用sort方法,按照String.CASE_INSENSITIVE_ORDER(字母大小写不敏感)的规则排序,结果是:[london, Milan, New Delhi, San Francisco, Tokyo]
如果使用Comparator.naturalOrder()字母自然顺序排序,结果是:[Milan, New Delhi, San Francisco, Tokyo, london]
在java 7我们是使用Collections.sort()接受一个数组参数,对数组进行排序。在java 8之后可以直接调用集合类的sort()方法进行排序。sort()方法可以传入一个字符串的排序规则,如:String.CASE_INSENSITIVE_ORDER,也可以传入一个排序器Comparator.naturalOrder()作为参数。
二、整数类型List排序
按数字的自然顺序排序,结果是[1, 2, 4, 6, 9]
三、按对象字段对对象List排序
这个功能就比较有意思了,举个例子大家理解一下。假设我们有一个类Movie,有三个成员变量分别是starred(是否收藏), title(电影名称), rating(评分)。
首先,我们创建了四个Movie对象,然后将它们转换为List
然后重点的的代码:使用了函数应用Movie::getTitle作为对象的排序字段,即按照电影的title作为排序字段
然后调用List的forEach方法将List排序结果打印出来,如下(当然我们重写了toString方法,不然打印结果没有意义):
如果我们希望List按照Title的倒序排序,就使用reversed()方法。如:Comparator.comparing(Movie::getTitle).reversed()。
四、使用自定义Comparator排序
我们自定义一个排序器,实现compare函数。返回0表示元素相等,-1表示前一个元素小于后一个元素,1表示前一个元素大于后一个元素。这个规则似乎和java 8之前没什么区别。
最终的打印结果如下,按照started的自定义规则进行排序。
这段代码如果以lambda表达式简写。箭头左侧是参数,右侧是函数体,参数类型和返回值根据上下文自动判断。如下:
五、通过Comparator链对对象List排序
上面这段代码先是按是否收藏的倒序排序,再按照电影的评分大小的倒序排序,排序结果如下:
来源:https://www.cnblogs.com/zimug/p/11769554.html
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#正则表达式匹配与替换字符串功能示例
SpringBoot向容器注册bean的方法详解
![](https://img.aspxhome.com/file/2023/5/91545_0s.jpg)
Java实现图片拼接
Java 开启多线程常见的4种方法
![](https://img.aspxhome.com/file/2023/0/58580_0s.png)
C#中的程序集和反射介绍
![](https://img.aspxhome.com/file/2023/8/98208_0s.png)
android开发教程之自定义属性用法详解
微信公众平台(测试接口)准备工作
![](https://img.aspxhome.com/file/2023/8/132218_0s.png)
Spring MVC URL地址映射的示例代码
![](https://img.aspxhome.com/file/2023/3/72903_0s.jpg)
C#使用委托(delegate)实现在两个form之间传递数据的方法
Spring MVC 基于URL的映射规则(注解版)
C#中重载与重写区别分析
![](https://img.aspxhome.com/file/2023/2/104342_0s.png)
Java文件操作工具类fileUtil实例【文件增删改,复制等】
idea激活ActivateJrebel热部署的方法详解
![](https://img.aspxhome.com/file/2023/2/132072_0s.jpg)
JAVA内存溢出解决方案图解
![](https://img.aspxhome.com/file/2023/9/125569_0s.png)
springboot验证码生成以及验证功能举例详解
![](https://img.aspxhome.com/file/2023/5/87195_0s.png)
SpringBoot中的yaml语法及静态资源访问问题
![](https://img.aspxhome.com/file/2023/6/86846_0s.png)
【Redis缓存机制】详解Java连接Redis_Jedis_事务
![](https://img.aspxhome.com/file/2023/7/72917_0s.jpg)
深入浅析jni中的java接口使用
![](https://img.aspxhome.com/file/2023/8/63168_0s.png)
Spring创建Bean的过程Debug的详细流程
![](https://img.aspxhome.com/file/2023/9/101979_0s.png)