Java8 按照对象属性值排序或者多个属性值排序

根据Person对象的年龄排序

/**
* 最炫写法,将集合转换成stream流处理,代码量少 正序
集合+stream流+sort排序(实现比较器)+收集流处理完的数据
*/
personList.stream().sorted(Comparator.comparing(Person::getAge)).collect(Collectors.toList());

/**
*  倒序 reversed()
*/
 personList.stream().sorted(Comparator.comparing(Person::getAge).reversed()).collect(Collectors.toList());

/**
* 如果需要多条件排序,thenComparing(),对于排序完的结果还可以接着操作
*/
List collect = personList.stream().sorted(Comparator.comparing(Person::getAge).thenComparing(Comparator.comparing(Person::getName))).collect(Collectors.toList());


知其然,知其所以然.为什么这样写?

//java8 之前对于引用对象的比较需要实现自定义比较器,通常使用内部类写法实现
Collections.sort(personList, new Comparator() {
    @Override
    public int compare(Person o1, Person o2) {
          return o1.getAge().compareTo(o2.getAge());
        }
 });

在java8之后,可以将代码改成这样:

/**
*使用stream的sort()或者
 Collections的sort() 
 ----Lambda表达式
*/
Collections.sort(personList, (o1, o2) -> o1.getAge().compareTo(o2.getAge()));
personList.stream().sorted((o1, o2) -> o1.getAge().compareTo(o2.getAge()))

/**
*Lambda表达式+函数式接口+方法引用

如果我们想要调用的方法拥有一个名字,我们就可以通过它的名字直接调用它。 
Comparator byAge = Comparator.comparing(Person::getAge); 
方法引用的标准形式是:类名::方法名。(注意:只需要写方法名,不需要写括号)
类型     示例
引用静态方法     ContainingClass::staticMethodName
引用某个对象的实例方法     containingObject::instanceMethodName
引用某个类型的任意对象的实例方法     ContainingType::methodName
引用构造方法     ClassName::new
静态方法引用例子:
  String::valueOf   等价于lambda表达式 (s) -> String.valueOf(s);

  Math::pow   等价于lambda表达式  (x, y) -> Math.pow(x, y);    

*/

Collections.sort(personList, Comparator.comparing(Person::getAge));

基础代码:Person类


public class Person {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

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

//获取集合数据
public static List getPerson(){
        List list = new ArrayList<>();
        int i = 1;
        do {
            Person p = new Person();
            p.setName("P" + i);
            p.setAge(i);
            list.add(p);
            i++;
        } while (i <= 10);
        return list;
    }

你可能感兴趣的:(Java8 按照对象属性值排序或者多个属性值排序)