本文简单介绍Comparable 和Comparator两个接口,并且说明通过stream流来进行排序比较。
1、Comparable
1.1、定义
Comparable定义为一个接口,如下:
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
入参为要对比的对象,若为空则会报空指针异常。返回值为int,当前对象大于、等于、小于对比对象时分别返回正数、零、负数。
1.2、实例
若一个类实现了Comparable接口,就意味着“该类支持排序”。
例如:Date
public class Date implements java.io.Serializable, Cloneable, Comparable<Date>{
...
public int compareTo(Date anotherDate) {
long thisTime = getMillisOf(this);
long anotherTime = getMillisOf(anotherDate);
return (thisTime<anotherTime ? -1 : (thisTime==anotherTime ? 0 : 1));
}
...
}
我们平时使用时,主要有两种用法:比较两个时间的大小和对时间排序。
代码如下:
public static void main(String[] args) {
//1、比较两个时间的大小
Date now = new Date();
Date before = new Date(now.getTime()-100000);
System.out.println(now.compareTo(before));
//2、对时间排序
ArrayList<Date> dates = new ArrayList<>();
Random random = new Random();
for (int i = 0;i<10;i++){
dates.add(new Date(now.getTime()-random.nextInt(10) * 10000));
}
Collections.sort(dates);
System.out.println(dates);
}
打印的结果可以如下
1
[Thu Nov 04 19:53:52 CST 2021,
Thu Nov 04 19:54:02 CST 2021,
Thu Nov 04 19:54:02 CST 2021,
Thu Nov 04 19:54:22 CST 2021,
Thu Nov 04 19:54:32 CST 2021,
Thu Nov 04 19:54:32 CST 2021,
Thu Nov 04 19:54:52 CST 2021,
Thu Nov 04 19:55:22 CST 2021,
Thu Nov 04 19:55:22 CST 2021,
Thu Nov 04 19:55:22 CST 2021]
2、Comparator
2.1、定义
Comparator 是比较器接口。定义如下:
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
int compare(T o1, T o2) 是“比较o1和o2的大小”。返回“负数”,意味着“o1比o2小”;返回“零”,意味着“o1等于o2”;返回“正数”,意味着“o1大于o2”。
Comparator 与 Comparable 相比就像是电磁炉与热水壶的区别,电磁炉用于给其他容器加热,更加灵活。热水壶在设计时就已经固定了结构,给自身内的水进行加热。
2.2、实例
我们定义了一个比较器 AscAgeComparator ,来分别对Person进行 升序 排序。
private static class AscAgeComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p1.getAge() - p2.getAge();
}
}
3、Stream
我们用stream流处理集合,同样stream也可以对集合排序。
public static void main(String[] args) {
Date now = new Date();
//2、对时间排序
ArrayList<Date> dates = new ArrayList<>();
Random random = new Random();
for (int i = 0;i<10;i++){
dates.add(new Date(now.getTime()-random.nextInt(10) * 10000));
}
List<Date> collectDates = dates.stream().sorted((a, b) -> (int) (a.getTime() - b.getTime())).collect(Collectors.toList());
System.out.println(collectDates);
}
sorted方法的入参就是一个Comparator比较器,这样写代码更加简洁易懂,推荐这样的写法
\