Java根据对象的某个字段排序

正好最近在项目开发中需要对保存在一个List中的对象根据其字段排序,遂总结一下吧,作为一个代码的搬运工,也是需要理解其原理的。

来一个简单的Person类:

public class Person {
    private Long id;

    private String name;

    public Person(Long id, String name) {
        this.id = id;
        this.name = name;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

现在的需求是根据姓名的拼音首字母进行排序,看代码实现:

 @Test
    public void testSort() {
        Person p1 = new Person(1l, "周杰伦");
        Person p2 = new Person(3l, "刘德华");
        Person p3 = new Person(2l, "张学友");
        Person p4 = new Person(4l, "成龙");
        Person p5 = new Person(5l, "胶布虫");

        List<Person> persons = Arrays.asList(p1, p2, p3, p4, p5);

        Collections.sort(persons, new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                Collator collator = Collator.getInstance(Locale.CHINA);
                return collator.compare(o1.getName(), o2.getName());
            }
        });

    }

使用Collections.sort方法,传一个Comparator实现类,比较对象字段实现compare方法。

反正我是比较喜欢lambda的写法(使用任何能让我少写代码的方法):

    Collections.sort(persons, (o1, o2) -> {
         Collator collator = Collator.getInstance(Locale.CHINA);
         return collator.compare(o1.getName(), o2.getName());
     });

// another way
persons.sort((p1, p2) -> p1.getName.compareTo(p2.getName));

Java中的对象排序都会跟Comparable Comparator 这两个接口扯上关系,网上已经有很多文章描述了,附文一篇,大家去看吧(实在不想重复造轮子的写,没那个时间):
http://www.journaldev.com/780/comparable-and-comparator-in-java-example
http://www.importnew.com/15259.html
https://sanaulla.info/2013/03/11/using-lambda-expression-to-sort-a-list-in-java-8-using-netbeans-lambda-support/