如何用一个接口优雅的实现2个List的翻页加载

简介: 如何用一个接口实现2个list的翻页加载,需求如下图所示,当list1数据全部加载完毕之后再返回list2的数据。

首先抛出我的问题?


如何用一个接口实现2个list的翻页加载,需求如下图所示,当list1数据全部加载完毕之后再返回list2的数据。(不限制list1和list2的数据个数,有多少条都要通过翻页加载取出来)


思路


  1. 关键问题是如何定义翻页,什么场景下开始返回list2的数据
  2. 翻页加载标配字段pageCount,来定义每页加载数量
  3. track定义翻页规则,用|分割,|前面是偏移量,|后面标记本次返回哪个list的数据
  4. 将list1和list2对应的返回场景定义为常量,方便区分


核心代码


const TYPE_LIST1 = 1; 
    const TYPE_LIST2 = 2;
        public static function demoList($userid, $pageCount = 10, $track = '', $select = '*')
    {
        $offsetTrack = 0;
        $typeTrack = 1;
        $more = 1;
        $list1 = [];
        $list2 = [];
        if (!empty($track)) {
            $decodeTrack = explode("|", $track);
            $offsetTrack = intval($decodeTrack[0]);
            $typeTrack = intval($decodeTrack[1]);
        }
        //取list1 或者 list1+list2
        if ($typeTrack == self::TYPE_LIST1) {
            $list1 = self::getList1($userid, $offsetTrack, $pageCount);
            //list1返回的个数比pageCount小 说明数据不足 需要在请求list2的数据
            $list1Count = count($list1);
            if ($list1Count < $pageCount) {
                $typeTrack = self::TYPE_LIST2;
                $offsetTrack = $list1Count;
            } else {
                $track = $offsetTrack + $list1Count . "|" . self::TYPE_LIST1;
                $more = 1;
            }
        }
        //只取list2
        if ($typeTrack == self::TYPE_LIST2) {
            $offset = $offsetTrack;
            $list2 = self::getList2($userid, $pageCount, $offset);
            $more = count($list2) < $pageCount ? 0 : 1;
            $track = $offset + count($list2) . "|" . self::TYPE_LIST2;
        }
        $ret = [
            'track' => $track,
            'more' => $more,
            'list1' => $list1,
            'list2' => $list2,
        ];
        return $ret;
    }
复制代码


进阶思路


  1. 上面代码简化了getList1(),getList()2,目的是直观的解答抛出的问题
  2. 实际项目中getList()方法内部有缓存数据处理,有考虑数据实时性的问题


进阶问题


  1. 比如需求变更为list2中的数据有一个状态,如果状态改变需要从list2列表中移动到list1列表中怎么处理?


思考


  1. 进阶问题考察的关键是状态改变,这个状态改变是实时变化的吗?实时变化的话,只有主动推送状态变化给客户端通知更新。
  2. 我们便引入了消息推送机制,保证数据结构体的一致性,当list2中的数据状态改变,就推送这条数据到客户端,又客户端添加到list1中


进阶思考


  1. 这样又引出了一个问题,list2中的数据如何移除,移除之后怎么保证再次翻页查找不会重复取数据,不会丢数据?
相关文章
|
4月前
|
存储 Java 测试技术
滚雪球学Java(57):解密Java中List接口底层实现原理
【6月更文挑战第11天】🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
38 2
滚雪球学Java(57):解密Java中List接口底层实现原理
|
3月前
|
文字识别 Java
文本,文字识别07,SpringBoot服务开发-入参和返回值,编写接口的时候,要注意识别的文字返回的是多行,因此必须是List集合,Bean层,及实体类的搭建
文本,文字识别07,SpringBoot服务开发-入参和返回值,编写接口的时候,要注意识别的文字返回的是多行,因此必须是List集合,Bean层,及实体类的搭建
|
3月前
|
前端开发
若依修改,配置了一个接口路径出现了,如何放通接口{ “msg“: “请求访问:/code/list,认证失败,无法访问系统资源“, “code“: 401}
若依修改,配置了一个接口路径出现了,如何放通接口{ “msg“: “请求访问:/code/list,认证失败,无法访问系统资源“, “code“: 401}
|
5月前
|
存储 安全 Java
Java的List、Set、Queue等接口及其实现类的技术性文章
Java的List、Set、Queue等接口及其实现类的技术性文章
30 1
|
5月前
|
Java 索引
【JAVA学习之路 | 进阶篇】List接口常用方法
【JAVA学习之路 | 进阶篇】List接口常用方法
|
5月前
|
存储 安全 Java
Java list set map等接口及其实现类
Java list set map等接口及其实现类
|
5月前
|
存储 算法 C语言
从C语言到C++_16(list的介绍和常用接口函数)
从C语言到C++_16(list的介绍和常用接口函数)
51 0
|
5月前
|
存储 安全 算法
Java一分钟之-Java集合框架入门:List接口与ArrayList
【5月更文挑战第10天】本文介绍了Java集合框架中的`List`接口和`ArrayList`实现类。`List`是有序集合,支持元素重复并能按索引访问。核心方法包括添加、删除、获取和设置元素。`ArrayList`基于动态数组,提供高效随机访问和自动扩容,但非线程安全。文章讨论了三个常见问题:索引越界、遍历时修改集合和并发修改,并给出避免策略。通过示例代码展示了基本操作和安全遍历删除。理解并正确使用`List`和`ArrayList`能提升程序效率和稳定性。
40 0
|
5月前
|
存储 编译器 C++
【C++/STL】list(常见接口、模拟实现、反向迭代器、)
【C++/STL】list(常见接口、模拟实现、反向迭代器、)
36 0
|
5月前
List()接口
List()接口