List排序方法

List排序方法

一、.使用 Stream 流排序(JDK1.8之后很好用,包括1.8都可以使用)

userBonusVOList=userBonusVOList.stream().sorted(Comparator.comparing(UserBonusVO::getUserJsAmount).reversed()).collect(Collectors.toList());

其中 reversed() 表示倒序的意思,如果不使用此方法则是正序。

扩展:排序字段为 null

使用 Stream 进行排序时,如果排序的字段出现 null 值就会导致异常发生,具体示例如下:
image
以上代码的执行结果,如下图所示:
image
想要解决上述问题,需要给 Comparator.comparing 传递第二个参数:Comparator.nullsXXX,如下代码所示:
image

Comparator.nullsFirst 表示将排序字段中的 null 值放到集合最前面,如果想要将 null 值放到集合最后面可以使用 Comparator.nullsLast。
以上代码的执行结果,如下图所示:
image

二、使用 Comparable 排序

按照本文设计的场景,我们需要创建一个包含了用户列表的 List 集合,并按用户的年龄从大到小进行排序,具体实现代码如下:
image

image

以上代码的执行结果,如下图所示:
image
本方法的核心代码如下:
image

三、使用 Comparator 排序

Comparable 是类内部的比较方法,而 Comparator 是排序类外部的比较器。使用 Comparator 比较器,无需修改原 Person 类,只需要扩充一个 Person 类的比较器就行了,Comparator 的实现方法有以下两种:

新建 Comparator 比较器;
使用 Comparator 匿名类比较器。
其中,第二种实现方法要更简洁一些,我们通过下面的具体代码,来观察一下二者的区别。

2.1 新建 Comparator 比较器

image
image

以上代码的执行结果,如下图所示:
image

2.2 匿名类比较器

image

以上代码的执行结果,如下图所示:
image

四、获取list集合中的某个元素下标(比如:排名的时候)

点击查看代码
//我的佣金排名
        int top = 0;
        for (int i=0;i<userBonusVOList.size();i++){
            if(userBonusVOList.get(i).getUserId().equals(userId)){
                top = i+1;
            }
        }
        log.info("top"+top);
        vo.setMyRankingNumber(top);

总结

本文介绍了 3 种 List 排序的方法以及获取list集合指定元素下标的方法,排序前两种方法常用于 JDK 8 之前的版本,其中比较器 Comparator 有两种实现的写法,而在 JDK 8 之后的版本,就可以使用 Comparator.comparing 实现排序了,如果排序字段中可能出现 null 值,要使用 Comparator.nullsXXX 进行排序处理(否则会报错)。

posted @ 2022-08-31 16:35  青喺半掩眉砂  阅读(884)  评论(0编辑  收藏  举报