java多字段排序
java8中,可以用Lambda的sorted进行排序。
有时我们还需要对多个字段进行排序。
多个字段排序,先对第一个排序字段排序,当第一个排序字段相同时,会使用第二个排序字段进行排序。
多字段排序的api
- 多个字段排序的格式
//第一个排序字段
Comparator<对象名> comparatorFirst = Comparator.comparing(对象名::方法名1);
//第二个排序字段,如果需要倒序就可以用reversed,不需要倒序就不用加 reversed
Comparator<对象名> comparatorSecond = Comparator.comparing(对象名::方法名2).reversed();
//多个字段排序
Comparator<对象名> comparator = comparatorFirst.thenComparing(comparatorSecond);
当然,也可以直接连起来写:
Comparator<对象名> comparator = Comparator.comparing(对象名::方法名1)
.thenComparing(Comparator.comparing(对象名::方法名2).reversed());
如果是三个以上的字段排序,就继续用 thenComparing 连接。
示例
- 对象类:
public class Order {
private String weight;
private double price;
private int age ;
//getter、 setter、构造方法
}
- 多个字段排序:
public static void orderFields() {
Order order1=new Order();
order1.setAge(10);order1.setPrice(1.3);
Order order2=new Order();
order2.setAge(10);order2.setPrice(33.6);
Order order3=new Order();
order3.setAge(66);order3.setPrice(55.8);
Order order4=new Order();
order4.setAge(33);order4.setPrice(55.3);
List<Order> list= new ArrayList<>();
list.add(order1);
list.add(order2);
list.add(order3);
list.add(order4);
//多个字段排序
Comparator<Order> comparator = Comparator.comparing(Order::getAge)
.thenComparing(Comparator.comparing(Order::getPrice).reversed());
List<Order> orderList = list.parallelStream()
.filter(Objects::nonNull)
.sorted(comparator)
.collect(Collectors.toList());
orderList.forEach(o -> System.out.println("age:"+ o.getAge()+",price:"+o.getPrice()));
}
输出结果如下,可以看到:
多个字段排序,先按age升序,age相同的,就按price降序。
age:10,price:33.6
age:10,price:1.3
age:33,price:55.3
age:66,price:55.8