一分钟系列:java中的排序(java8前后的排序)
工作中经常会遇到对一些bean排序的操作,例如对用户按照年龄/生日/身份证信息进行排序。今天的一分钟系列,我们来看看java8之前以及java8中是如何排序的。
现在假设我们有如下的用户对象。
package xuelongjiang.javaSortExample;
/**
* @author codexiulian
*/
public class User {
private Integer age;
private Integer idCard;
private String name;
public User() {
}
public User(Integer age, Integer idCard, String name) {
this.age = age;
this.idCard = idCard;
this.name = name;
}
// 省略get/set方法以及toString方法
}
Java8之前的排序
public class JavaEightBeforeSort {
public static void main(String[] args) {
List<User> list = new ArrayList<>();
list.add(new User(1,12,"java"));
list.add(new User(2,13, "python"));
list.add(new User(3,14, "js"));
list.add(new User(4,15, "scala"));
list.add(new User(5,16, "ruby"));
list.add(new User(6,17, "c"));
Collections.sort(list, new Comparator<User>() {
@Override
public int compare(User o1, User o2) {
return o2.getAge() - o1.getAge();
}
});
for(User user : list){
System.out.println(user);
}
}
}
使用Collections.sort方法,通过Comparator的匿名内部类实现了对年龄的降序排序。
User{age=6, idCard=17, name='c'}
User{age=5, idCard=16, name='ruby'}
User{age=4, idCard=15, name='scala'}
User{age=3, idCard=14, name='js'}
User{age=2, idCard=13, name='python'}
User{age=1, idCard=12, name='java'}
java8使用函数式编程
public class Java8Sort {
public static void main(String[] args) {
List<User> list = new ArrayList<>();
list.add(new User(1,12,"java"));
list.add(new User(2,13, "python"));
list.add(new User(3,14, "js"));
list.add(new User(4,15, "scala"));
list.add(new User(5,16, "ruby"));
list.add(new User(6,17, "c"));
list.sort((o1, o2) -> o2.getAge() - o1.getAge());
list.forEach(o1 -> System.out.println(o1));
}
}
list.sort的另一种表示:
list.sort(Comparator.comparingInt(User::getAge).reversed());
//先升序之后利用 reversed进行反序
java8中也可以很方便的进行多条件排序:
例如对年龄正序,以及身份证号反序。
list.sort(Comparator.comparing(User::getAge)
.thenComparing(
(o1,o2)-> o2.getIdCard() - o1.getIdCard()
));
使用lambda表达式可以替代匿名内部的写法,并且写出的代码可读性更强,并且lambda的功能相比匿名内部类更加强大(多条件排序)。