1.需求背景:
由于更复杂的业务逻辑需要处理,所以sql中的排序(type asc,allAmt desc null as last)不能满足,就改为java中对多条数据处理后,再装入List汇总后再排序。
2.VO
@Getter
@Setter
public class Order {
private Long id;
private Long userId;
private String num;
private String type;
private Float allAmt;
private Float payAmt;
private Integer orderNum;
}
3.测试方法
package com.sort;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author: liminghui
* @date: 2021/3/13 23:54
* @version: 1.0
* @description:
*/
public class SortTest {
public static void main(String[] args) {
ArrayList<Order> orders = new ArrayList<>();
Order order1 = new Order();
order1.setType("a");
order1.setAllAmt(10f);
Order order2 = new Order();
order2.setType("a");
order2.setAllAmt(20f);
Order order3 = new Order();
order3.setType("b");
order3.setAllAmt(10f);
Order order4 = new Order();
orders.add(order1);
orders.add(order2);
orders.add(order3);
orders.add(order4);
// 先按照订单类型降序,再按照订单应付金额从高到低排序,null放最后
// sort1(orders);
// sort2(orders);
sort3(orders);
}
private static List<Order> sort3(List<Order> orders) {
List<Order> orderList = orders.stream().sorted(Comparator.comparing(Order::getType, Comparator.reverseOrder())
.thenComparing(Order::getAllAmt, Comparator.reverseOrder())
).collect(Collectors.toList());
return orderList;
}
// 先按照订单类型降序,再按照订单应付金额从高到低排序,支持空值null
private static void sort2(List<Order> orders) {
orders.sort(Comparator.comparing(Order::getType, (o1, o2) -> o1 == null ? 1 : (o2 == null ? -1 : o2.compareTo(o1)))
.thenComparing(Order::getAllAmt, (o1, o2) -> o1 == null ? 1 : (o2 == null ? -1 : o2.compareTo(o1)))
);
}
// 先按照订单类型降序,再按照订单应付金额从高到低排序,不支持空值null
private static void sort1(List<Order> orders) {
orders.sort(Comparator.comparing(Order::getType, Comparator.reverseOrder())
.thenComparing(Order::getAllAmt, Comparator.reverseOrder()));
}
}
本文介绍了一个Java案例,展示了如何使用Stream API对订单数据进行排序。首先按照订单类型降序,然后按订单应付金额从高到低排序,确保null值正确处理。

被折叠的 条评论
为什么被折叠?



