Java集合分页

简介:       在Java开发中,若单次展示的数据量太大,会造成程序响应缓慢,就需要用到 分页 功能,每一页展示一定量的数据,分多次展示 ... 那么在List集合中,如何实现 分页 功能呢?        本文将以3种方式,分别是: subList 方法、Java8 Stream 、Lists.partition,实现 List集合的分页功能。

一、前言

       在Java开发中,若单次展示的数据量太大,会造成程序响应缓慢,就需要用到 分页 功能,每一页展示一定量的数据,分多次展示 ... 那么在List集合中,如何实现 分页 功能呢?


       本文将以3种方式,分别是: subList 方法、Java8 Stream 、Lists.partition,实现 List集合的分页功能。

二、代码实现

1、假设有一个 list集合,元素如下:

ArrayList<Integer> list = Lists.newArrayList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);


2、使用 subList 实现分页:

/**@Description: subList 分页

* <br> 1. 起始位置边界值处理: 当前页码 <= 0 情况处理; 当前页码 > 最大页码 情况处理

* <br> 2. 终止位置边界值处理: 当前页码 <= 0 情况处理; 终止位置 <= 总记录数  情况处理

* @param pageSize 每页显示的数量

* @param pageNum  当前页码

* @version v1.0

* @author wu

* @date 2022/7/31 11:44

*/

private List<?> subList(ArrayList<?> list, int pageSize, int pageNum) {

   int count = list.size(); // 总记录数

   // 计算总页数

   int pages = count % pageSize == 0 ? count / pageSize : count / pageSize + 1;

   // 起始位置

   int start = pageNum <= 0 ? 0 : (pageNum > pages ? (pages - 1) * pageSize : (pageNum - 1) * pageSize);

   // 终止位置

   int end = pageNum <= 0 ? (pageSize <= count ? pageSize : count) : (pageSize * pageNum <= count ? pageSize * pageNum : count);

   return list.subList(start, end);

}

3、Java8 Stream 分页

/**@Description: Java8 Stream 分页

* <br> 1. 起始位置边界值处理: 同 subList 方法

* <br> 2. 终止位置:无需处理,会自动处理边界问题

*  @param pageSize 每页显示的数量

*  @param pageNum  当前页码

* @version v1.0

* @author wu

* @date 2022/7/31 11:49

*/

private List<?> subListJava8(ArrayList<?> list, int pageSize, int pageNum) {

   int count = list.size(); // 总记录数

   // 计算总页数

   int pages = count % pageSize == 0 ? count / pageSize : count / pageSize + 1;

   // 起始位置

   int start = pageNum <= 0 ? 0 : (pageNum > pages ? (pages - 1) * pageSize : (pageNum - 1) * pageSize);

   // 终止位置

   int end = pageSize ;

   return list.stream().skip(start).limit(pageSize).collect(Collectors.toList());

}

 4、使用 Lists 工具类的 partition 分页

/**@Description: 使用 Lists 工具类的 partition 分页

* <br> 1. 页码边界值处理:小于等于0,情况处理; 页码大于 (总页数-1) 情况处理

* <br> 2. 总页数-1 ,原因是:list集合索引是从0开始的。

*  @param pageSize 每页显示的数量

*  @param pageNum  当前页码

* @version v1.0

* @author wu

* @date 2022/7/31 11:55

* @see com.google.common.collect.Lists#partition(java.util.List, int)

*/

private List<?> partition(ArrayList<?> list, int pageSize, int pageNum) {

   // 将 List 按照 PageSzie 拆分成多个List

   List<? extends List<?>> partition = Lists.partition(list, pageSize);

   // 总页数

   int pages = partition.size();

   pageNum = pageNum <= 0 ? 0 : (pageNum <= (pages - 1) ? pageNum : (pages - 1));

   return partition.get(pageNum);

}

三、测试


       1、使用List的 subList 方法实现分页 测试:

/**

* @Description: 使用List的 subList 方法实现分页

* @version v1.0

* @author wu

* @date 2022/7/31 10:43

*/

@Test

public void subListTest() {

   int pageSize = 3; // 每一页显示的数量

   int pageNum = 2; // 页码

   System.out.println(subList(list, pageSize, -2));

   System.out.println(subList(list, pageSize, 0));

   System.out.println(subList(list, pageSize, 1));// 第一页

   System.out.println(subList(list, pageSize, 2));

   System.out.println(subList(list, pageSize, 3));

   System.out.println(subList(list, pageSize, 4)); // 第四页数据

   System.out.println(subList(list, pageSize, 5)); // 第五页数据

}

  2、使用 Java8 Stream 实现分页 测试:

/**@Description: 使用 Java8 Stream 实现分页

* @version v1.0

* @author wu

* @date 2022/7/31 11:44

*/

@Test

public void subListJava8Test() {

   int pageSize = 3; // 每一页显示的数量

   int pageNum = 2; // 页码

   System.out.println(subListJava8(list, pageSize, -2));

   System.out.println(subListJava8(list, pageSize, 0));

   System.out.println(subListJava8(list, pageSize, 1));// 第一页

   System.out.println(subListJava8(list, pageSize, 2));

   System.out.println(subListJava8(list, pageSize, 3));

   System.out.println(subListJava8(list, pageSize, 4)); // 第四页数据

   System.out.println(subListJava8(list, pageSize, 5)); // 第四页数据

}

3、Lists 工具类的 partition 分页 测试:

@Test

public void partitionTest() {

   int pageSize = 3; // 每一页显示的数量

   int pageNum = 2; // 页码

   System.out.println(partition(list, pageSize, -2));

   System.out.println(partition(list, pageSize, 0));

   System.out.println(partition(list, pageSize, 1));// 第一页

   System.out.println(partition(list, pageSize, 2));

   System.out.println(partition(list, pageSize, 3));

   System.out.println(partition(list, pageSize, 4)); // 第四页数据

   System.out.println(partition(list, pageSize, 5)); // 第五页数据

   System.out.println(partition(list, pageSize, 6)); // 第六页数据

}

四、总结


       1、以上是List集合实现分页的3种方式,在实际工作应用中,一般很少,都是在数据中实现好的分页,偶尔遇到实际要使用时,翻开文章,可以做到 “开箱即用”!


       2、注意点:本文分页案例中,都已经对 极端情况(边界值)处理,可以有效避免索引越界的情况,如下:

     开始位置: 当前页码值 <= 0 , 取值 第一页 ; 当前页码 > 总页数 , 取值 总页数

     结束位置:当前页码值 <= 0 ,则判断 每页显示数据 是否小于总记录数 ( pageSize <= count       ? pageSize : count ); 当前页码 > 0 , 则判断 结束数量 是否小于等于 总记录数 ( pageSize       *  pageNum <= count ? pageSize * pageNum : count )

3、Lists 工具类,依赖 pom.xml :

<dependency>

   <groupId>com.google.guava</groupId>

   <artifactId>guava</artifactId>

   <version>28.0-jre</version>

</dependency>

4、补充一个 List 集合创建 笛卡尔积的方法:

List<List<Integer>> lists = Lists.cartesianProduct(list1, list2);

相关文章
|
16天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
33 6
|
16天前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
33 3
|
16天前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
26 2
|
18天前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
25 3
|
12天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
41 5
|
11天前
|
Java 程序员 调度
Java|PageHelper 怎么自作主张帮我分页?
没有调用 PageHelper.startPage,查询怎么也被自动分页了?
10 2
|
14天前
|
安全 Java 程序员
Java集合之战:ArrayList vs LinkedList,谁才是你的最佳选择?
本文介绍了 Java 中常用的两个集合类 ArrayList 和 LinkedList,分析了它们的底层实现、特点及适用场景。ArrayList 基于数组,适合频繁查询;LinkedList 基于链表,适合频繁增删。文章还讨论了如何实现线程安全,推荐使用 CopyOnWriteArrayList 来提升性能。希望帮助读者选择合适的数据结构,写出更高效的代码。
42 3
|
16天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
【10月更文挑战第16天】Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。通过 hashCode() 和 equals() 方法实现唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 添加和遍历元素,体现了 Set 的高效性和简洁性。
21 4
|
18天前
|
存储 Java 数据处理
Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。
Java Set:无序之美,不重复之魅!Set 是 Java 集合框架中的一个接口,不包含重复元素且不保证元素顺序。它通过 hashCode() 和 equals() 方法确保元素唯一性,适用于需要唯一性约束的数据处理。示例代码展示了如何使用 HashSet 实现这一特性。
22 5
|
19天前
|
Java 开发者
在Java的集合世界里,Set以其独特的特性脱颖而出,它通过“哈希魔法”和“红黑树防御”两大绝技
【10月更文挑战第13天】在Java的集合世界里,Set以其独特的特性脱颖而出。它通过“哈希魔法”和“红黑树防御”两大绝技,有效抵御重复元素的侵扰,确保集合的纯洁性和有序性。无论是“人海战术”还是“偷梁换柱”,Set都能从容应对,成为开发者手中不可或缺的利器。
30 6