Java:在List中对数据进行分页

郎家岭伯爵 2023年11月27日 404次浏览

前言

在开发中,分页是一个频繁使用的技术点。通常我们会在 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 数据进行分页。