Comparable接口在JDK8中的源码:
public interface Comparable<T> {
public int compareTo(T o);
}
@Data
@AllArgsConstructor
public class User implements Comparable<User>{
private int id;
private int age;
@Override
public int compareTo(User o) {
if( this.age > o.age){
return 1;
}else if(this.age < o.age){
return -1;
}else{
return 0;
}
}
public static void main(String[] args) {
User user1 = new User(1, 14);
User user2 = new User(2, 12);
User user3 = new User(3, 10);
User[] users = {user1, user2, user3};
Arrays.sort(users);
System.out.println(Arrays.toString(users));
//[User(id=3, age=10), User(id=2, age=12), User(id=1, age=14)]
}
}
int compareTo(T o)
比较此对象与指定对象的顺序。如果该对象小于、等于或大于指定对象,则分别返回负整数、零或正整数。
参数: o - 要比较的对象。
返回:负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。
抛出:ClassCastException - 如果指定对象的类型不允许它与此对象进行比较
Comparable接口在JDK8中的源码:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
default Comparator<T> thenComparing(Comparator<? super T> other) {
Objects.requireNonNull(other);
return (Comparator<T> & Serializable) (c1, c2) -> {
int res = compare(c1, c2);
return (res != 0) ? res : other.compare(c1, c2);
};
}
default Comparator<T> thenComparingInt(ToIntFunction<? super T> keyExtractor)
{
return thenComparing(comparingInt(keyExtractor));
}
...
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserComparator implements Comparator<UserComparator> {
private Integer id;
private Integer age;
@Override
public int compare(UserComparator o1, UserComparator o2) {
if(o1.getAge() > o2.getAge()) {
return 1;
} else if(o1.getAge() < o2.getAge()){
return -1;
}else
return 0;
}
public static void main(String[] args) {
UserComparator u1 = new UserComparator(1, 14);
UserComparator u2 = new UserComparator(2, 12);
UserComparator u3 = new UserComparator(3, 10);
List<UserComparator> list = new ArrayList<UserComparator>();
list.add(u1);
list.add(u2);
list.add(u3);
Collections.sort(list,new UserComparator());
System.out.println(list.toString());
//[User(id=3, age=10), User(id=2, age=12), User(id=1, age=14)]
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserComparator2 {
private Integer id;
private Integer age;
public static void main(String[] args) {
UserComparator u1 = new UserComparator(1, 14);
UserComparator u2 = new UserComparator(2, 12);
UserComparator u3 = new UserComparator(3, 10);
List<UserComparator> list = new ArrayList<UserComparator>();
list.add(u1);
list.add(u2);
list.add(u3);
Collections.sort(list, (o1,o2) -> (o1.getAge()-o2.getAge()));
list.stream().forEach(System.out::println);
//UserComparator(id=3, age=10)
//UserComparator(id=2, age=12)
//UserComparator(id=1, age=14)
}
}
reversed方法
default Comparator<T> reversed() {
return Collections.reverseOrder(this);
}
参考:Comparable接口和Comparator接口的使用和区别_IT_10的博客-CSDN博客
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/mingyuli/article/details/120435937
内容来源于网络,如有侵权,请联系作者删除!