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