public ResultVo<IPage<Obj>> getObj (Page<Obj> page, Obj obj) {
QueryWrapper<Obj> queryWrapper = new QueryWrapper<Obj>()
//可以加条件查询
.orderByDesc("create_time"); // 基本排序
IPage<Obj> pageList = Service.page(page, queryWrapper);//开始分页
List<Obj> sortedList = pageList.getRecords().stream()//pageList 是从数据库中获取的分页结果,其中 getRecords() 方法返回了一个包含所有记录的列表(List<Obj>)。
.sorted((p1, p2) -> {
if ("1".equals(p1.getTop()) && "1".equals(p2.getTop())) {
return p2.getToptime().compareTo(p1.getToptime());
} else if ("1".equals(p1.getTop())) {
return -1;
} else if ("1".equals(p2.getTop())) {
return 1;
} else {
return p2.getCreateTime().compareTo(p1.getCreateTime());
}
})
.collect(Collectors.toList());
IPage<Obj> sortedPage = new Page<>(page.getCurrent(), page.getSize(), pageList.getTotal());
sortedPage.setRecords(sortedList);//new Page<>(page.getCurrent(), page.getSize(), pageList.getTotal()):使用原始分页对象的当前页、每页大小和总记录数创建一个新的分页对象。
//sortedPage.setRecords(sortedList):将排序后的列表设置到新的分页对象中。
return ResultVo.success(sortedPage);
}
接下来详细讲述下使用内存排序
优点:
- 灵活性:可以处理复杂的排序逻辑,这些逻辑可能在SQL中难以实现。
- 调试:在Java中调试排序逻辑通常比较简单。
缺点:
- 性能:对于大数据集,在内存中进行排序可能会影响性能,尤其是在数据量较大的情况下。
在 Java 的排序机制中,Comparator
是用来定义两个对象的排序顺序的。当你使用 Comparator
接口的 compare
方法时,它的返回值决定了这两个对象的相对顺序。具体地:
return -1
表示第一个对象应该排在第二个对象之前。return 1
表示第一个对象应该排在第二个对象之后。return 0
表示两个对象的顺序可以互换(它们相等)。
详细解释:
假设我们有两个对象 p1
和 p2
,我们希望通过比较它们来确定它们的顺序。
return -1
:表示p1
应该排在p2
之前。return 1
:表示p1
应该排在p2
之后。return 0
:表示p1
和p2
在排序中是等价的(它们的位置不需要交换)。
拿我的排序举例
List<Obj> sortedList = pageList.getRecords().stream()
.sorted((p1, p2) -> {
if ("1".equals(p1.getTop()) && "1".equals(p2.getTop())) {
return p2.getToptime().compareTo(p1.getToptime());
} else if ("1".equals(p1.getTop())) {
return -1;
} else if ("1".equals(p2.getTop())) {
return 1;
} else {
return p2.getCreateTime().compareTo(p1.getCreateTime());
}
})
.collect(Collectors.toList());
排序逻辑分解:
-
if ("1".equals(p1.getProductTop()) && "1".equals(p2.getProductTop()))
:- 如果
p1
和p2
都是productTop
为'1'
的记录,那么就按照product_toptime
排序(降序)。 p2.getProductToptime().compareTo(p1.getProductToptime())
:p2
的product_toptime
和p1
的product_toptime
进行比较。因为p2
的时间在前,所以如果结果为负值,则p2
排在p1
前面。
- 如果
-
else if ("1".equals(p1.getProductTop()))
:- 如果
p1
的productTop
为'1'
而p2
的productTop
不是'1'
,那么p1
应该排在p2
前面。 return -1
表示p1
应该排在p2
前面。
- 如果
-
else if ("1".equals(p2.getProductTop()))
:- 如果
p2
的productTop
为'1'
而p1
的productTop
不是'1'
,那么p2
应该排在p1
前面。 return 1
表示p2
应该排在p1
前面。
- 如果
-
else
:- 如果
p1
和p2
都不是productTop
为'1'
的记录,则按create_time
排序(降序)。 p2.getCreateTime().compareTo(p1.getCreateTime())
:p2
的create_time
在前,所以如果结果为负值,则p2
排在p1
前面。
- 如果