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;

/**
 * @author 向振华
 * @date 2022/12/01 18:18
 */
public class Test {

    @Data
    @AllArgsConstructor
    public static class Shop {
        private String name;
        private Double price;
        private Integer count;
    }

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

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

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

输出结果

Test.Shop(name=8, price=7.7, count=60)
Test.Shop(name=7, price=7.7, count=60)
Test.Shop(name=2, price=null, count=30)
Test.Shop(name=3, price=4.4, count=20)
Test.Shop(name=6, price=8.8, count=20)
Test.Shop(name=5, price=8.8, count=20)
Test.Shop(name=1, price=3.3, count=10)
Test.Shop(name=4, price=6.6, count=null)

Java 8,可以使用Stream API来对多个字段进行排序,并且可以将空值放在排序的最后。下面是一个示例代码: ```java import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Objects; public class Main { public static void main(String[] args) { // 创建一个对象列表 List<Person> personList = new ArrayList<>(); personList.add(new Person("张三", 20, 175)); personList.add(new Person("李四", 22, null)); personList.add(new Person("王五", 18, 160)); personList.add(new Person("赵六", null, 170)); // 按照年龄和身高进行排序空值在后 personList.sort(Comparator .comparing(Person::getAge, Comparator.nullsLast(Integer::compareTo)) .thenComparing(Person::getHeight, Comparator.nullsLast(Integer::compareTo))); // 输出排序结果 personList.forEach(System.out::println); } } class Person { private String name; private Integer age; private Integer height; public Person(String name, Integer age, Integer height) { this.name = name; this.age = age; this.height = height; } public String getName() { return name; } public Integer getAge() { return age; } public Integer getHeight() { return height; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", height=" + height + '}'; } } ``` 输出结果为: ``` Person{name='王五', age=18, height=160} Person{name='张三', age=20, height=175} Person{name='李四', age=22, height=null} Person{name='赵六', age=null, height=170} ``` 在上面的代码,我们使用了`Comparator.comparing`方法来构建比较器,`Comparator.nullsLast`方法来将空值放在排序的最后。`thenComparing`方法可以在前一个比较器相等的情况下,再按照后一个比较器进行排序
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值