一分钟系列:java中的排序(java8前后的排序)

一分钟系列: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的功能相比匿名内部类更加强大(多条件排序)。

发布了121 篇原创文章 · 获赞 56 · 访问量 167万+

猜你喜欢

转载自blog.csdn.net/u013565163/article/details/87310757