Merge pull request #1761 from luckymorning/v5-dev

增加列表分页并逐页返回数据的工具方法
This commit is contained in:
Golden Looly 2021-08-17 21:34:09 +08:00 committed by GitHub
commit c6291993f9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 0 deletions

View File

@ -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 <T> 集合元素类型
* @param list 源数据列表
* @param pageSize 每页的条目数
* @param pageListConsumer 单页数据函数式返回
*/
public static <T> void page(List<T> list, int pageSize, Consumer<List<T>> 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<T> pageList = ListUtil.toCopyOnWriteArrayList(list.subList(start, end));
// 返回数据
pageListConsumer.accept(pageList);
}
}
/**
* 针对List排序排序会修改原List
*

View File

@ -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<List<Integer>> 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