一、业务场景

  为了加快首页数据查询的效率,因此将首页查询的数据大多数都放在了缓存中,包括各种list集合数据。对这些

从缓存中获取的数据做了一个兜底处理,如果从缓存中没有获取到数据,则直接从数据库中去查询获取数据,然后

在对查询到的数据做进一步的处理。从缓存中获取的数据都已经做排序处理了,可是对查询的数据如何进行排序处理呢?

二、需求分析

  这里查询的时候,数据量不多,全国范围内的数据加起来估计也就几千条,因此是按照一定的条件进行全量查询,获取

到数据后在进行过滤,然后是按照指定的要求进行排序。业务需求可能会按照多种方式进行排序,而且有可能是降序或者是

升序,因此排序方式还不能写死。那自己能想到的办法有java8中的stream流排序,其次就是list集合自带的排序接口sort.

三、解决方案

  自己私下里做了简单的测试,两种方式都可以进行排序,不过为了简化代码的操作,考虑使用list集合自带的排序接口来

进行排序。首先看对于这个自带接口的说明,

排序接口是传一个比较器,然后集合底层会自动的进行排序。

先做一个简单的测试,从结果来看,默认是升序排序,按照年龄从小到大的排序。如果想降序的话怎么处理呢?很简单,调用一个方法reversed()即可。

结果如图,符合预期.

问题来了,如何想要先按照年龄排序,然后在按照生日排序怎么处理呢?

代码如下:

public class UserSortTest {
    public static void main(String[] args) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        List<User> users = new ArrayList<>();
        User user1 = new User();
        user1.setAge(20);
        Date date1 = sdf.parse("2020-12-06 12:26:10");
        user1.setBirthday(date1);
        users.add(user1);
        User user2 = new User();
        user2.setAge(20);
        Date date2 = sdf.parse("2008-12-06 20:30:26");
        user2.setBirthday(date2);
        users.add(user2);
        users.sort(Comparator.comparing(User::getAge).thenComparing(User::getBirthday));
        for (User user : users) {
            System.out.println("user--->" + user.toString());
        }
    }
}

这是先按照岁数升序,然后在是按照生日升序排序的结果,如果按照生日降序排序,则就需要改变一下代码,如下:

users.sort(Comparator.comparing(User::getAge).thenComparing(Comparator.comparing(User::getBirthday).reversed()));

在比较器中在传入一个比较器,这样就可以解决问题,测试结果如下.

继续如果有一个参数为null会报异常,这种情况如何处理呢?

比较器排序中也做了响应的处理,处理方式如下:

users.sort(Comparator.comparing(User::getAge).thenComparing(User::getBirthday,Comparator.nullsLast(Date::compareTo)));

这行代码的含义是将为null值的数据排在最后面,测试结果如下.

上面的方式学会了,如果还有第三种排序方式,则继续在后面添加方法即可,

这段代码的含义是:首先按照年龄升序排序,然后按照出生日期升序排序,出生日期为null的排在后面,最后按照用户名称升序排序。

学会了这几种排序方式之后,自己就可以在代码中进行任意组合,来达到自己对于排序的要求,很好的完成业务需求。有其他建议的

小伙伴,欢迎留言讨论。

Java中list集合自定义排序-2022新项目的更多相关文章

  1. JAVA中的集合与排序

    一:常见的集合类 Collection接口  和   Map接口 Collection ①:collection是最常见的集合的上级接口. ②:继承自collection的常用接口有List,Set, ...

  2. Java中单列集合List排序的真实应用场景

    一.需求描述 最近产品应客户要求提出了一个新的需求,有一个列表查询需要按照其中的多列进行排序. 二.需求分析 由于数据总量不多,可以全部查询出来,因此我就考虑使用集合工具类Collections.so ...

  3. 项目开发中Maven的单向依赖-2022新项目

    一.业务场景 工作多年,在真实的项目开发中经常会遇到将一个项目拆分成多个工程的情况,比如将一个真实的项目拆分成controller层,service层, dao层,common公共服务层等等.这样拆分 ...

  4. java中list集合的内容,如何使用像数据库中group by形式那样排序

    java中list集合的内容,如何使用像数据库中group by形式那样排序,比如:有一个 List<JavaBean> 他中包含了一些如下的内容JavaBean:name    mone ...

  5. java中的集合操作类(未完待续)

    申明: 实习生的肤浅理解,如发现有错误之处.还望大牛们多多指点 废话 事实上我写java的后台操作,我每次都会遇到一条语句:List<XXXXX> list = new ArrayList ...

  6. Java中的集合框架-Collections和Arrays

    上一篇<Java中的集合框架-Map>把集合框架中的键值对容器Map中常用的知识记录了一下,本节记录一下集合框架的两个工具类Collections和Arrays 一,Collections ...

  7. Java中的集合框架-Map

    前两篇<Java中的集合框架-Commection(一)>和<Java中的集合框架-Commection(二)>把集合框架中的Collection开发常用知识点作了一下记录,从 ...

  8. Java中的集合(七)双列集合顶层接口------Map接口架构

    Java中的集合(七)双列集合顶层接口------Map接口 一.Map接口的简介 通过List接口,我们知道List接口下的集合是单列集合,数据存储是单列的结构.Map接口下是一个键值对(key-v ...

  9. Java中的集合(四)PriorityQueue常用方法

    Java中的集合(四)PriorityQueue常用方法 PriorityQueue的基本概念等都在上一篇已说明,感兴趣的可以点击 Java中的集合(三)继承Collection的Queue接口 查看 ...

随机推荐

  1. 论文解读(AGE)《Adaptive Graph Encoder for Attributed Graph Embedding》

    论文信息 论文标题:Adaptive Graph Encoder for Attributed Graph Embedding论文作者:Gayan K. Kulatilleke, Marius Por ...

  2. 探究Presto SQL引擎(3)-代码生成

    ​ vivo 互联网服务器团队- Shuai Guangying 探究Presto SQL引擎 系列:第1篇<探究Presto SQL引擎(1)-巧用Antlr>介绍了Antlr的基本用法 ...

  3. django框架8

    内容概要 ajax简介 前后端传输数据编码格式 ajax发送json格式数据 ajax携带文件数据 回调机制处理策略 内容详情 ajax简介 页面不刷新的情况下可以与后端进行数据交互 异步提交 局部刷 ...

  4. 2021.03.20【NOIP提高B组】模拟 总结

    区间 DP 专场:愉快爆炸 T1 题目大意 有 \(n\) 个有颜色的块,连续 \(k\) 个相同颜色的就可以消掉 现在可以在任意位置插入任意颜色的方块,问最少插入多少个可以全部抵消 题解 先把连续的 ...

  5. Linux服务器启动jstatd服务

    Linux服务器启动jstatd服务 1.查找jdk所在目录 2.在jdk的bin目录下创建文件jstatd.all.policy touch jstatd.all.policy 3.写入安全配置 g ...

  6. Django从数据库导model迁移乱码

    python manage.py inspectdb > [your app name]\models.py 执行后 model.py乱码,将models.py以 UTF-16LE打开.

  7. js 表面学习 - 认识事件

    事件 描述 onchange HTML 元素已被改变 onclick 用户点击了 HTML 元素 onmouseover 用户把鼠标移动到 HTML 元素上 onmouseout 用户把鼠标移开 HT ...

  8. (原创)【MAUI】一步一步实现“悬浮操作按钮”(FAB,Floating Action Button)

    一.前言 MAUI,跨平台的 GUI 框架,基本介绍本文不再赘述. 话不多说,既然可以跨平台,那么我们就来实现一个在移动端很常用的控件:悬浮操作按钮(FAB,Floating Action Butto ...

  9. Linux修改默认ssh22端口

    1.检查端口是否可用 使用下面的命令检查您想增加或修改的端口号是否被占用,执行命令后如果没有任何打印,说明这个端口没有被占用 netstat -lnp|grep 23456 2.修改配置文件 ssh配 ...

  10. Qt点名器

    项目已开源,点击跳转 废话不多说,直接上代码. CMakeLists.txt cmake_minimum_required(VERSION 3.10) project(qt-caller) find_ ...