java PageUtil + stream 手动计算List 分页

交代一下前言,数据是redis中查询

140,193,88,117 格式大概是这样。 需要切割为long类型的list数组。需要手动计算分页,去mongodb中查询数据。

 

这里我用的手动计算分页的是 hutool 工具包

import cn.hutool.core.util.PageUtil;  里面挺多实用的工具
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
</dependency>
int[] ints = PageUtil.transToStartEnd(page - 1, pageSize);

传入页码,和数据条数,计算数据起始位置

 将页数和每页条目数转换为开始位置和结束位置 此方法用于包括结束位置的分页方法 例如:
       页码:0,每页10 =》 [0, 10]
       页码:1,每页10 =》 [10, 20]
       ……
       
当setFirstPageNo(int)设置为1时:
       页码:1,每页10 =》 [0, 10]
       页码:2,每页10 =》 [10, 20]
       ……
      
Params:
pageNo – 页码(从0计数)
pageSize – 每页条目数
Returns:
第一个数为开始位置,第二个数为结束位置

        int[] ints = PageUtil.transToStartEnd(page - 1, pageSize);

通过工具返回起始页码。

      //根据起点, 和 终点, 截取到中间的vid 查询
            List<Long> vids = split.stream().skip(ints[0]).limit(ints[1]).map(Long::valueOf).collect(Collectors.toList());

通过stream 流。搭配分页工具。 实现手动分页。 .map(Long::valueOf) 将string 转为Long 类型

collect(Collectors.toList()); 收集到分页之后的数据。如果起始位置超出list集合的size 不为报错。结束位置超出list的size 不会出错。 但是size为0 。 if (vids.size() > 0) { 判断一下。进行下面的步骤。

其实罗里吧嗦一大堆,代码就两行。

         //   将页数和每页条目数转换为开始位置和结束位置 此方法用于包括结束位置的分页方法 例如:   页码:0,每页10 =》 [0, 10]
            int[] ints = PageUtil.transToStartEnd(page - 1, pageSize);
            //根据起点, 和 终点, 截取到中间的vid 查询
            List<Long> vids = split.stream().skip(ints[0]).limit(ints[1]).map(Long::valueOf).collect(Collectors.toList());

 这里放一下这个方法的全部代码吧。

    /**
     * 分页查询小视频列表,按照时间倒序排序 优先查询推荐的视频,如果没有推荐的视频或已经查询完成。再查询默认的
     *
     * @param userId   用户id
     * @param page     第几页
     * @param pageSize 每页几条
     * @return PageInfo<Video>
     */
    @Override
    public PageInfo<Video> queryVideoList(Long userId, Integer page, Integer pageSize) {
        //返回的结果集
        PageInfo<Video> pageInfo = new PageInfo<>();
        pageInfo.setPageNum(page);
        pageInfo.setPageSize(pageSize);

        //小视频推荐 redis key
        String redisKey = RedisKeyUtils.getVIDEOKEY(userId);
        //redis推荐视频vid  140,193,88,117, vid
        String redisValue = redisTemplate.opsForValue().get(redisKey);

        //如果redis中推荐的视频id不为空
        int recommendCount = 0;

            //如果redis 推荐视频不为空
        if (StringUtils.isNotEmpty(redisValue)) {
            //分割key
            List<String> split = StrUtil.split(redisValue, ',');

            //用于查找默认视频时,跳过的页数计算
            recommendCount = split.size();

            //   将页数和每页条目数转换为开始位置和结束位置 此方法用于包括结束位置的分页方法 例如:   页码:0,每页10 =》 [0, 10]
            int[] ints = PageUtil.transToStartEnd(page - 1, pageSize);
            //根据起点, 和 终点, 截取到中间的vid 查询
            List<Long> vids = split.stream().skip(ints[0]).limit(ints[1]).map(Long::valueOf).collect(Collectors.toList());

            //如果推荐视频vid 不为空,查询推荐视频
            if (vids.size() > 0) {
                Query query = Query.query(Criteria.where("vid").in(vids));
                List<Video> videos = mongoTemplate.find(query, Video.class);
                pageInfo.setRecords(videos);
                return pageInfo;
            }
        }

        //解决为了让默认视频从0开始,如果之前推荐视频已经刷到第四页。这里需要减去4,包装从0页往下查询
        int totalPage = PageUtil.totalPage(recommendCount, pageSize);
        //如果推荐视频为空,或查询完毕,查询返回默认的视频列表
        PageRequest pageRequest = PageRequest.of(page - totalPage - 1, pageSize,
                Sort.by(Sort.Order.desc("created")));
        Query query = new Query();
        query.with(pageRequest);
        List<Video> videos = mongoTemplate.find(query, Video.class);
        pageInfo.setRecords(videos);
        return pageInfo;

    }

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Silence丶你的名字

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值