Java List中通过对象属性排序,可实现多条件排序

直接上代码:

java 复制代码
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.Data;

import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

/**
 * List 对象属性排序
 */

@Data
@AllArgsConstructor
class Commodity
{
    private String name;
    private Double price;
    private Integer count;
}

public class Test {
    public static void main(String[] args) {
        // 创建参数
        List<Commodity> list = Lists.newArrayList(
                new Commodity("1", 3.3, 10),
                new Commodity("2", null, 30),
                new Commodity("3", 4.4, 20),
                new Commodity("4", 6.6, null),
                new Commodity("5", 8.8, 20),
                new Commodity("6", 8.8, 20),
                new Commodity("7", 7.7, 60),
                new Commodity("8", 7.7, 60)
        );

        // 多排序条件
        List<Commodity> orderShopList = list.stream().sorted(Comparator
                // 先按数量降序(由于是降序,nullsFirst()方法会将null值放在后面)
                .comparing(Commodity::getCount, Comparator.nullsFirst(Integer::compareTo).reversed())
                // 然后按价格升序(由于是升序,nullsFirst()方法会将null值放在前面)
                .thenComparing(Commodity::getPrice, Comparator.nullsFirst(Double::compareTo))
                // 然后按名称降序(如果不设置null值排序规则,字段为null会报错)
                .thenComparing(Commodity::getName, Comparator.reverseOrder())
        ).collect(Collectors.toList());

        // 打印排序结果
        orderShopList.forEach(System.out::println);
    }
}

运行结果如下:

相关推荐
kyriewen115 分钟前
Next.js部署:从本地跑得欢,到线上飞得稳
开发语言·前端·javascript·科技·react.js·前端框架·ecmascript
AI人工智能+电脑小能手5 分钟前
【大白话说Java面试题】【Java基础篇】第21题:HashMap和Hashtable的区别是什么
java·开发语言·面试·哈希算法·散列表·hash table
不想写代码的星星7 分钟前
COW(Copy-on-Write):开抄开抄,哎嘿,我装的
开发语言·c++
慕容卡卡9 分钟前
Claude 使用神器(web页面)--CloudCLI UI
java·开发语言·前端·人工智能·ui·spring cloud
咬_咬10 分钟前
go语言学习(函数)
开发语言·学习·golang
Sylvia-girl12 分钟前
C++内存如何管理?
java·jvm·c++
froginwe1112 分钟前
PHP MySQL Delete 操作指南
开发语言
凯瑟琳.奥古斯特14 分钟前
图论核心考点精讲
开发语言·数据结构·算法·排序算法·哈希算法
极创信息14 分钟前
信创领域五种主流CPU架构(X86 / ARM / RISC-V / MIPS / LoongArch)
java·arm开发·数据库·spring boot·mysql·软件工程·risc-v
charlie11451419119 分钟前
嵌入式Linux驱动开发(8)——内存映射 I/O - 别拿物理地址当指针用
linux·开发语言·驱动开发·c·imx6ull