Java8中的sort与Comparator、Comparable

在Java8中,sort() 方法、Comparator 接口和 Comparable 接口是用于对数组或集合进行排序的重要工具,其中 Comparator 接口适用于自定义比较规则,而 Comparable 接口适用于定义对象自身的比较规则。
假如我们有一个实体类

点击查看代码
public class CoinUserIncome{
    private Long id;
    private Integer availableNum;
}

如果想要对id进行排序,一般我们有以下几种方式。

点击查看代码
List<CoinUserIncome> objects = Lists.newArrayList();
        objects.add(CoinUserIncome.builder().id(100L).availableNum(100).build());
        objects.add(CoinUserIncome.builder().id(20L).availableNum(100).build());
        objects.add(CoinUserIncome.builder().id(200L).availableNum(100).build());
        objects.add(CoinUserIncome.builder().id(200L).availableNum(20).build());
        // 第一种
        objects.sort(Comparator.comparing(CoinUserIncome::getId));
        // 第二种 先对id排序后降序,再在id的基础上对availableNum排序后降序
        objects = objects.stream().sorted(Comparator.comparing(CoinUserIncome::getId).reversed().thenComparing(Comparator.comparing(CoinUserIncome::getAvailableNum).reversed()))
                .collect(Collectors.toList());
        // 通过内部重写compareTo方法排序,compareTo这个方法可以是任意类里的一个方法
        objects = objects.stream().sorted((t1, t2) -> compareTo_sort(t1, t2)).collect(Collectors.toList());
        // 第四种,CoinUserIncome类实现Comparable接口,重新compareTo方法,当调用sorted方法的时候,会默认调用实现好的compareTo方法
        objects = objects.stream().sorted().collect(Collectors.toList());

        System.out.println(JSON.toJSONString(objects));


public int compareTo_sort(CoinUserIncome other1 ,CoinUserIncome other) {
        if (other1.getId().compareTo(other.getId()) != 0) {
            return -other1.getId().compareTo(other.getId());
        }
        return -other1.getAvailableNum().compareTo(other.getAvailableNum());
    }
点击查看代码

实现Comparable接口

public class CoinUserIncome implements Comparable<CoinUserIncome> {
    private Long id;
    private Integer availableNum;

    // 构造方法、getter 和 setter 略

    @Override
    public int compareTo(CoinUserIncome other) {
        if (this.id.compareTo(other.id) != 0) {
            return this.id.compareTo(other.id);
        }
        return this.availableNum.compareTo(other.availableNum);
    }
}

其实不用Comparable接口也是可以通过其他三种方式实现排序的,

posted @ 2023-05-11 18:11  杀出重围啊  阅读(334)  评论(0编辑  收藏  举报