Java8 Comparator接口reverse复合排序
今天遇到个问题, 产品说是 先按A字段升序排, 再按B字段降序排
举例,如下实体类
@Data
public Class Book() {
//书的类型
private Integer type;
//书的价格
private Integer money;
}
要求按类型升序, 价格降序
尝试如下
list.sort(Comparator.comparing(Book::getType())
.thenComparing(Book::getMoney()));
-------------------------打印结果-------------------
类型 : 0 , 价格: 0
类型 : 0 , 价格: 0
类型 : 0 , 价格: 0
类型 : 0 , 价格: 1
类型 : 0 , 价格: 1
类型 : 0 , 价格: 1
类型 : 1 , 价格: 0
类型 : 1 , 价格: 0
类型 : 1 , 价格: 1
类型 : 1 , 价格: 1
看到 type 和 money都按升序排了,不符合要求, type是对的,那将money反转就行
list.sort(Comparator.comparing(Book::getType())
.thenComparing(Book::getMoney()).reversed());
-------------------------打印结果-------------------
类型 : 1 , 价格: 1
类型 : 1 , 价格: 1
类型 : 1 , 价格: 0
类型 : 1 , 价格: 0
类型 : 0 , 价格: 1
类型 : 0 , 价格: 1
类型 : 0 , 价格: 1
类型 : 0 , 价格: 0
类型 : 0 , 价格: 0
类型 : 0 , 价格: 0
注意,整体反转了, 连type也进行了反转, 离谱!! 怎么办呢, 尝试先反转type看看效果
list.sort(Comparator.comparing(Book::getType().reversed())
.thenComparing(Book::getMoney()));
-------------------------打印结果-------------------
类型 : 1 , 价格: 0
类型 : 1 , 价格: 0
类型 : 1 , 价格: 1
类型 : 1 , 价格: 1
类型 : 0 , 价格: 0
类型 : 0 , 价格: 0
类型 : 0 , 价格: 0
类型 : 0 , 价格: 1
类型 : 0 , 价格: 1
类型 : 0 , 价格: 1
看到,type是降序的, money是升序的。 整体再进行反转即可
list.sort(Comparator.comparing(Book::getType().reversed())
.thenComparing(Book::getMoney()).reversed());
-------------------------打印结果-------------------
类型 : 1 , 价格: 0
类型 : 1 , 价格: 0
类型 : 1 , 价格: 1
类型 : 1 , 价格: 1
类型 : 0 , 价格: 0
类型 : 0 , 价格: 0
类型 : 0 , 价格: 0
类型 : 0 , 价格: 1
类型 : 0 , 价格: 1
类型 : 0 , 价格: 1
这个reversed() 把人搞晕了