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 1fe606472..082da42f7 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 @@ -16,6 +16,7 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.function.Consumer; /** * List相关工具类 @@ -272,6 +273,39 @@ public class ListUtil { return sub(list, startEnd[0], startEnd[1]); } + /** + * 对指定List进行分页,逐页返回数据 + * + * @param 集合元素类型 + * @param list 源数据列表 + * @param pageSize 每页的条目数 + * @param pageListConsumer 单页数据函数式返回 + */ + public static void page(List list, int pageSize, Consumer> pageListConsumer) { + if (CollUtil.isEmpty(list)) { + 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++) { + // 获取当前页在列表中对应的起止序号 + int[] startEnd = PageUtil.transToStartEnd(pageNo, pageSize); + int start = startEnd[0]; + int end = startEnd[1]; + if (end > size) { + end = size; + } + // 使用拷贝,防止对返回分页数据进行增删操作时影响源数据的分页结果 + CopyOnWriteArrayList pageList = ListUtil.toCopyOnWriteArrayList(list.subList(start, end)); + // 返回数据 + pageListConsumer.accept(pageList); + } + } + /** * 针对List排序,排序会修改原List * 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 229486afb..9be1b06bd 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 @@ -100,6 +100,25 @@ public class ListUtilTest { PageUtil.setFirstPageNo(1); int[] d1 = ListUtil.page(0,8,a).stream().mapToInt(Integer::valueOf).toArray(); Assert.assertArrayEquals(new int[]{1,2,3,4,5},d1); + + + List> pageListData = new ArrayList<>(); + ListUtil.page(a, 2, pageListData::add); + Assert.assertArrayEquals(new int[]{1, 2}, pageListData.get(0).stream().mapToInt(Integer::valueOf).toArray()); + Assert.assertArrayEquals(new int[]{3, 4}, pageListData.get(1).stream().mapToInt(Integer::valueOf).toArray()); + Assert.assertArrayEquals(new int[]{5}, pageListData.get(2).stream().mapToInt(Integer::valueOf).toArray()); + + + pageListData.clear(); + ListUtil.page(a, 2, pageList -> { + pageListData.add(pageList); + if (pageList.get(0).equals(1)) { + pageList.clear(); + } + }); + Assert.assertArrayEquals(new int[]{}, pageListData.get(0).stream().mapToInt(Integer::valueOf).toArray()); + Assert.assertArrayEquals(new int[]{3, 4}, pageListData.get(1).stream().mapToInt(Integer::valueOf).toArray()); + Assert.assertArrayEquals(new int[]{5}, pageListData.get(2).stream().mapToInt(Integer::valueOf).toArray()); } @Test