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接口也是可以通过其他三种方式实现排序的,
 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号