根据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<Person> collect = personList.stream().sorted(Comparator.comparing(Person::getAge).thenComparing(Comparator.comparing(Person::getName))).collect(Collectors.toList());
知其然,知其所以然.为什么这样写?
//java8 之前对于引用对象的比较需要实现自定义比较器,通常使用内部类写法实现
Collections.sort(personList, new Comparator<Person>() {
@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<Person> getPerson(){
List<Person> 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;
}