From 2b04713104f64c7e6430db78d71e403c66ca26bb Mon Sep 17 00:00:00 2001 From: Looly Date: Tue, 17 Aug 2021 21:57:41 +0800 Subject: [PATCH] add page --- CHANGELOG.md | 2 ++ .../cn/hutool/core/collection/ListUtil.java | 28 ++++++++----------- .../hutool/core/collection/ListUtilTest.java | 2 +- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 19525228c..f0b0e1d60 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,8 @@ ### 🐣新特性 * 【core 】 增加NamingCase类 +* 【core 】 ListUtil增加page方法重载(pr#1761@Github) +* ### 🐞Bug修复 ------------------------------------------------------------------------------------------------------------- diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java index 082da42f7..c08f15ad3 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/ListUtil.java @@ -2,6 +2,7 @@ package cn.hutool.core.collection; import cn.hutool.core.comparator.PinyinComparator; import cn.hutool.core.comparator.PropertyComparator; +import cn.hutool.core.lang.Console; import cn.hutool.core.lang.Matcher; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; @@ -280,29 +281,24 @@ public class ListUtil { * @param list 源数据列表 * @param pageSize 每页的条目数 * @param pageListConsumer 单页数据函数式返回 + * @since 5.7.10 */ public static void page(List list, int pageSize, Consumer> pageListConsumer) { - if (CollUtil.isEmpty(list)) { + if (CollUtil.isEmpty(list) || pageSize <= 0) { return; } - if (pageSize <= 0) { - return; - } - PageUtil.setFirstPageNo(0); - int size = list.size(); - int page = PageUtil.totalPage(size, pageSize); - for (int pageNo = PageUtil.getFirstPageNo(); pageNo < page; pageNo++) { + + final int total = list.size(); + final int totalPage = PageUtil.totalPage(total, pageSize); + for (int pageNo = PageUtil.getFirstPageNo(); pageNo < totalPage + PageUtil.getFirstPageNo(); pageNo++) { // 获取当前页在列表中对应的起止序号 - int[] startEnd = PageUtil.transToStartEnd(pageNo, pageSize); - int start = startEnd[0]; - int end = startEnd[1]; - if (end > size) { - end = size; + final int[] startEnd = PageUtil.transToStartEnd(pageNo, pageSize); + if (startEnd[1] > total) { + startEnd[1] = total; } - // 使用拷贝,防止对返回分页数据进行增删操作时影响源数据的分页结果 - CopyOnWriteArrayList pageList = ListUtil.toCopyOnWriteArrayList(list.subList(start, end)); + // 返回数据 - pageListConsumer.accept(pageList); + pageListConsumer.accept(sub(list, startEnd[0], startEnd[1])); } } diff --git a/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java index 9be1b06bd..a49d8bba5 100644 --- a/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/collection/ListUtilTest.java @@ -101,7 +101,7 @@ public class ListUtilTest { int[] d1 = ListUtil.page(0,8,a).stream().mapToInt(Integer::valueOf).toArray(); Assert.assertArrayEquals(new int[]{1,2,3,4,5},d1); - + // page with consumer List> pageListData = new ArrayList<>(); ListUtil.page(a, 2, pageListData::add); Assert.assertArrayEquals(new int[]{1, 2}, pageListData.get(0).stream().mapToInt(Integer::valueOf).toArray());