前言
在开发中,分页
是一个频繁使用的技术点。通常我们会在 SQL 层使用分页参数来实现,例如 MySQL 中的 limit
参数。
但有些特殊场景无法在 SQL 中使用分页。例如查询涉及到多表查询,且表数据较多,无法连表查询(强行连表会有严重的性能问题)。
针对这种业务场景我们该如何解决呢?
我们可以在 Java 中对 List 进行分页。
解决
方式一:使用subList()方法
我们使用如下 demo 示例:
@GetMapping("/t11")
public void test11(){
// 创建数据
List<Map<String, Object>> list = new ArrayList<>(List.of(
Map.of("key", "10"),
Map.of("key", "5"),
Map.of("key", "25"),
Map.of("key", "30"),
Map.of("key", 50)));
/*
或者可以这样创建数据。
List<Map<String, Object>> list = new ArrayList<>();
list.add(Map.of("yourKey", 10));
list.add(Map.of("yourKey", 5));
list.add(Map.of("yourKey", 25));
list.add(Map.of("yourKey", 30));
list.add(Map.of("yourKey", 50));
*/
/*
这里注意避坑。这是一个不可变List,无法排序。
List<Map<String, Object>> list = List.of(
Map.of("key", 10),
Map.of("key", 5),
Map.of("key", 25),
Map.of("key", 30),
Map.of("key", 50));
*/
System.out.println("排序前:" + list);
list = list.stream().sorted(Comparator.comparing(m -> String.valueOf(m.get("key")))).collect(Collectors.toList());
System.out.println("排序后:" + list);
// 指定分页参数
int pageSize = 2; // 每页的大小
int page = 2; // 要获取的页数(从1开始)
// 计算起始索引和结束索引
int startIndex = (page - 1) * pageSize;
int endIndex = Math.min(startIndex + pageSize, list.size());
// 获取分页结果
list = list.subList(startIndex, endIndex);
// 打印分页结果
System.out.println("分页List:" + list);
}
输出:
排序前:[{key=10}, {key=5}, {key=25}, {key=30}, {key=50}]
排序后:[{key=10}, {key=25}, {key=30}, {key=5}, {key=50}]
分页List:[{key=30}, {key=5}]
注:
- 在以上示例中,需要注意使用
List.of()
方式创建的 List 是不可变的,而使用new ArrayList(List.of())
创建的 List 是可变的。
方式二:使用Stream流
使用如下 demo 示例:
@GetMapping("/t12")
public void test12(){
// 创建数据
List<Map<String, Object>> list = new ArrayList<>(List.of(
Map.of("key", 10),
Map.of("key", 5),
Map.of("key", 25),
Map.of("key", 30),
Map.of("key", 50)));
System.out.println("排序前:" + list);
List<Map<String, Object>> list1 = list.stream()
.sorted(Comparator.comparing(m -> (int) m.get("key"))).collect(Collectors.toList());
System.out.println("排序后:" + list1);
// 指定分页参数
int pageSize = 2; // 每页的大小
int page = 3; // 要获取的页数(从1开始)
// 计算起始索引和结束索引
int startIndex = (page - 1) * pageSize;
int endIndex = Math.min(pageSize, list.size() - (page - 1) * pageSize);
List<Map<String, Object>> key = list.stream()
.sorted(Comparator.comparing(m -> (int) m.get("key")))
.skip(startIndex)
.limit(endIndex)
.collect(Collectors.toList());
System.out.println("排序加分页后:" + key);
}
输出:
排序前:[{key=10}, {key=5}, {key=25}, {key=30}, {key=50}]
排序后:[{key=5}, {key=10}, {key=25}, {key=30}, {key=50}]
排序加分页后:[{key=50}]
总结
在 Java 代码中对 List 数据进行分页。