记录一下对集合排序,处理属性为空且参与排序方法

一、需求

实际项目中经常存在对集合某个或多个属性进行排序,例如根据姓名排序,根据金额排序;或者多个字段排序,例如姓名首字母升序+金额降序两个字段排序等等。
但是有时候姓名或金额会为空,之前我们排序的时候需要拿出这些属性做判空处理,然后再排序,不然会报错。今天这个方法不用自己处理空字段判读了,并且值为空也参与排序。

二、了解Comparator.nullsFirst和Comparator.nullsLast

1、Comparator.nullsFirst

  • 空元素被认为小于非空元素。
  • 当两个元素都是空的时候,那么它们被认为是相等的。
  • 当两个元素都是非空的时候,指定的比较器决定了顺序。
  • 如果指定的比较器是空的,那么返回的比较器认为所有非空的元素是相等的。

2、Comparator.nullsLast

  • 空元素被认为是大于非空元素的。
  • 当两个元素都是空的时候,那么它们被认为是相等的。
  • 当两个元素都是非空的时候,指定的比较器决定了顺序。
  • 如果指定的比较器是空的,那么返回的比较器认为所有非空的元素是相等的。

三、了解Comparator.naturalOrder和Comparator.reverseOrder

1、Comparator.naturalOrder

  • 自然排序,升序

2、Comparator.reverseOrder

  • 扭转自然排序,降序

四、定义实体类

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;
import java.math.BigDecimal;

/**
 * @Author:
 * @Description
 * @Date: 下午2:09 2024/1/23
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class SortEmpty implements Serializable {

    /**
     * 姓名
     */
    private String name;
    /**
     * 年龄
     */
    private Integer age;
    /**
     * 奖学金
     */
    private BigDecimal amount;

}

五、测试排序

import lombok.extern.slf4j.Slf4j;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @Author:
 * @Description
 * @Date: 下午2:10 2024/1/23
 */
@Slf4j
public class SortTest {

    /**
     * 单个字段排序
     */
    public static void oneFiledSort() {
        //mock 数据
        List<SortEmpty> list = getData();
        //根据奖学金降序排序,并且奖学金为空的放到最后
        List<SortEmpty> amountSort = list.stream().sorted(Comparator.comparing(SortEmpty::getAmount, Comparator.nullsFirst(BigDecimal::compareTo)).reversed()).collect(Collectors.toList());
        log.info("************amountSort根据奖学金降序排序,并且奖学金为空的放到最后,排序后结果如下");
        amountSort.forEach(e -> log.info("" + e));
        //根据姓名升序排序,并且名字为空的放到最后
        List<SortEmpty> nameSort = list.stream().sorted(Comparator.comparing(SortEmpty::getName, Comparator.nullsLast(String::compareTo))).collect(Collectors.toList());
        log.info("************根据姓名升序排序,并且名字为空的放到最后,排序后结果如下");
        nameSort.forEach(e -> log.info("" + e));
    }

    /**
     * 多个字段排序
     * 根据姓名首字母升序,奖学金降序
     */
    public static void manyFiledSort() {
        //mock 数据
        List<SortEmpty> list = getData();
        //  多字段排序规则
        Comparator<SortEmpty> comparator5 = Comparator.comparing(SortEmpty::getName, Comparator.nullsLast(Comparator.naturalOrder()))
                .thenComparing(SortEmpty::getAmount, Comparator.nullsLast(Comparator.reverseOrder()));
        List<SortEmpty> orderList = list.parallelStream().sorted(comparator5).collect(Collectors.toList());
        log.info("************多个字段排序,根据姓名首字母升序,奖学金降序结果如下");
        orderList.forEach(e -> log.info("" + e));
    }

    /**
     * mock 数据
     *
     * @param
     */
    public static List<SortEmpty> getData() {
        List<SortEmpty> list = new ArrayList<>();
        list.add(new SortEmpty("abc", 11, null));
        list.add(new SortEmpty("gbc", 112, BigDecimal.valueOf(50)));
        list.add(new SortEmpty(null, 13, BigDecimal.valueOf(1000)));
        list.add(new SortEmpty("lbc", 119, null));
        list.add(new SortEmpty("lbc", 119, BigDecimal.valueOf(300)));
        list.add(new SortEmpty("lbc", 119, BigDecimal.valueOf(600)));
        return list;
    }

    /**
     * 测试
     *
     * @param args
     */
    public static void main(String[] args) {
        oneFiledSort();
        manyFiledSort();
    }
}

六、结果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/342947.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(Bean工厂的后处理器入门)学习Spring的第七天

一 . Bean工厂的后处理器入门 : 直接上图 BeanDefinitionRegistyPostProcessor 为 BeanFactoryProcessor的子接口 , 前者先执行(图里只有Bean工厂的后处理器第一个类型) 如下图 : 这两个接口可改变两个Map(BeanDefinitionMap , singletonObject)里的信息 (黑马只讲了BeanFact…

linux LPT和COM回路测试(基于python+Qt+C++)

软件UI: 回路治具&#xff08;COMLPT&#xff09;&#xff1a; lpt_test.cpp&#xff08;c 源代码&#xff09;&#xff1a; #include <iostream> #include <fstream> #include <sstream> #include <unistd.h> #include <fcntl.h> #include <…

SCDN高防如何保护你的服务器

随着互联网的发展&#xff0c;如今的网络世界&#xff0c;虽说给我们的衣食住行带来了非常大的便利&#xff0c;但同时它存在着各种各样的威胁。比如我们的网站&#xff0c;如果不做任何保护措施的话&#xff0c;就很容易被DDoS、CC等攻击堵塞网络、窃取目标系统的信息&#xf…

惬意上手Python —— 装饰器和内置函数

1. Python装饰器 Python中的装饰器是一种特殊类型的函数&#xff0c;它允许用户在不修改原函数代码的情况下&#xff0c;增加或修改函数的行为。 具体来说,装饰器的工作原理基于Python的函数也是对象这一事实&#xff0c;可以被赋值给变量、作为参数传递给其他函数或者作为其他…

【易经】-- 风水基础

目录 一、基础概念 1、五行 2、十天干 3、十二地支 4、八卦 4.1 伏羲八卦次序图 4.2 八卦对应自然界的基本事物 4.3 八卦及所代表的意像 ​编辑 5、生辰八字 5.1 定义 5.2 换算方法 5.3 举例 5.4 八字排盘示例 5.5 算法实现 二、举例 1、计算某年的生肖和年的属…

【nginx实战】nginx正向代理、反向代理、由反向代理实现的负载均衡、故障转移详解

文章目录 一. 正向代理与反向代理的概念二. Nginx服务器的正向代理服务1. Nginx服务器正向代理服务的配置的3个指令1.1. resolver指令1.2. resolver_timeout指令1.3. proxy_pass指令 2. Nginx服务器正向代理服务的使用 三. Nginx服务器的反向代理服务1. 反向代理的基本指令1.1.…

高数总结(1

目录 1.总结&#xff1a;小结&#xff1a; 1.总结&#xff1a; 小结&#xff1a; 关注我给大家分享更多有趣的知识&#xff0c;以下是个人公众号&#xff0c;提供 ||代码兼职|| ||代码问题求解|| 由于本号流量还不足以发表推广&#xff0c;搜我的公众号即可&#xff1a;

基于51单片机的超声波物位测量系统[proteus仿真]

基于51单片机的超声波物位测量系统[proteus仿真] 超声波检测系统这个题目算是课程设计和毕业设计中常见的题目了&#xff0c;本期是一个103基于51单片机的超声波物位测量系统 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】&#xff0c;赞赏任意文章 2&#xf…

Redis 笔记二

概览 1.高并发秒杀问题及可能出现的bug 2.秒杀场景JVM级别锁和分布式锁 3.大厂分布式锁Redisson框架 4.从Redisson源码剖析lua解决锁原子性问题 5.从Redisson源码剖析经典锁续命问题 6.Redis主从架构锁失效如何解决 7.Redlock分布式锁高并发下可能存在的问题 8.双十一大促如何将…

【学习】FPN特征金字塔

论文&#xff1a;Feature Pyramid Networks for Object Detection &#xff08;CVPR 2016) 参考blog&#xff1a;https://blog.csdn.net/weixin_55073640/article/details/122627966 参考视频讲解&#xff1a;添加链接描述 卷积网络中&#xff0c;深层网络容易响应语义特征&am…

【C++】list容器功能模拟实现

介绍 上一次介绍了list队容器的迭代器模拟&#xff0c;这次模拟实现list的简单功能&#xff0c;尤其要注意构造函数、析构函数、以及赋值运算符重载的实现。 list容器需要接纳所有类型的数据&#xff0c;因此&#xff0c;结构设置与迭代器设置同理&#xff0c;需要引入结点&…

Dirichlet Process 3

本节来介绍如何构造G&#xff0c;这里使用Stick-breaking construction算法 如下图H是关于的分布 对于G&#xff0c;这里面有2个变量&#xff0c;一个是&#xff0c;即采样的位置&#xff0c;一个是&#xff0c;即的权重 每次采样一次称为一个item 第一次采样 ,, 第二次采样…

c++的命名空间

命名空间 一.c的关键字二.命名空间2.1 命名空间定义2.1 命名空间的使用2.1.1加命名空间名称及作用域限定符2.1.2使用using将命名空间中某个成员引入 三.标准命名空间std 一.c的关键字 c中一共有63个关键字 关键字11111asmdoifreturntrycontinueautodoubleinlineshorttypedeff…

vue echarts地图

下载地图文件&#xff1a; DataV.GeoAtlas地理小工具系列 范围选择器右侧行政区划范围中输入需要选择的省份或地市&#xff0c;选择自己想要的数据格式&#xff0c;这里选择了geojson格式&#xff0c;点右侧的蓝色按钮复制到浏览器地址栏中&#xff0c;打开的geojson文件内容…

LeetCode 670 最大交换数

周一&#xff0c;非常冷&#xff0c;大风呼呼的&#xff0c;上班路都走不动。 好消息&#xff0c;马上要过年了。大风吹&#xff0c;天气好。 过年过年&#xff0c;回家过年~ 学生时代的迷茫是不应该存在的&#xff0c;最好的时光应该尽情享受&#xff0c;而不应该自己给加层…

三年的功能测试,让我女朋友跑了,太难受了...

简单概括一下 先说一下自己的情况&#xff0c;普通本科&#xff0c;18年通过校招进入深圳某软件公司&#xff0c;干了3年多的功能测试&#xff0c;21年的那会&#xff0c;因为大环境不好&#xff0c;我整个人心惊胆战的&#xff0c;怕自己卷铺盖走人了&#xff0c;我感觉自己不…

测试数据: 在线MP4和图片url地址

收集整理一些开发中用到的测试数据 目录 MP4图片ICON MP4 https://media.w3.org/2010/05/sintel/trailer.mp4 图片 https://img-blog.csdnimg.cn/fcc22710385e4edabccf2451d5f64a99.jpeg ICON https://img-blog.csdnimg.cn/direct/fb1e1f109889467a85eec6af0984611c.png 以…

协同过滤源代码在真实数据集上运行及优化

最近在做推荐算法相关研究&#xff0c; 先拿一个协同过滤代码练手。 网上找代码很容易&#xff0c;但是大多是讲原理的示例代码&#xff0c;在真实数据集上运行问题特别多。 以一个2w节点的开源数据集为例&#xff08;baby.inter&#xff09; https://github.com/enoche/MM…

PSIM仿真DSP28335ADC功能并使用SCI串口模块输出曲线

在使用PSIM 2022 软件仿真DSP28335单片机时&#xff0c;发现里面还有SCI串口打印模块&#xff0c;在仿真软件里面可以看到串口数据&#xff0c;但是将代码下载到单片机上之后&#xff0c;使用串口助手却看不到任何数据&#xff0c;经过一番探索终于发现&#xff0c;串口不是这样…

【linux】串口工具

1. PuTTY - 尽管PuTTY更为人所知作为SSH和Telnet客户端&#xff0c;但它也有串口连接能力。 - 在Debian上可以通过命令 sudo apt-get install putty 来安装PuTTY。 2. Minicom - Minicom是一个字符界面的串行通信程序&#xff0c;经常用于调试串口和模拟器。 - 可以通过…