交代一下前言,数据是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>*/@Overridepublic PageInfo<Video> queryVideoList(Long userId, Integer page, Integer pageSize) {//返回的结果集PageInfo<Video> pageInfo = new PageInfo<>();pageInfo.setPageNum(page);pageInfo.setPageSize(pageSize);//小视频推荐 redis keyString redisKey = RedisKeyUtils.getVIDEOKEY(userId);//redis推荐视频vid  140,193,88,117, vidString redisValue = redisTemplate.opsForValue().get(redisKey);//如果redis中推荐的视频id不为空int recommendCount = 0;//如果redis 推荐视频不为空if (StringUtils.isNotEmpty(redisValue)) {//分割keyList<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;}

java PageUtil + stream 手动计算List 分页相关推荐

  1. 使用Java 8 Stream像操作SQL一样处理数据(上)

    转载自 使用Java 8 Stream像操作SQL一样处理数据(上) 几乎每个Java应用都要创建和处理集合.集合对于很多编程任务来说是一个很基本的需求.举个例子,在银行交易系统中你需要创建一个集合来 ...

  2. Java Reactor Stream

    一.Reactor 概念/POM 更多内容,前往 IT-BLOG "具有非阻塞负压功能的异步流处理系统" 的标准以及API.主要用来构建 JVM环境下的非阻塞应用程序.它直接和 J ...

  3. java 8——Stream

    Part 1 Java8新增的功能中,要数lambda表达式和流API最为重要了.这篇文章主要介绍流API的基础,也是流API系列的第一部分,话不多说,直奔主题. 什么是流API? 它能做一些什么? ...

  4. Java 8 stream的记录

    Java 8 stream的记录 Java 8 stream 1.什么是流 2.如何生成流 1.通过集合生成,应用中最常用的一种 2.通过数组生成 3.通过值生成 4.通过文件生成 5.通过函数生成 ...

  5. 使用java Steam流进行逻辑分页(内存分页)

    物理分页与逻辑分页 物理分页 物理分页依赖的是某一物理实体,这个物理实体就是数据库,比如MySQL数据库提供了limit关键字,程序员只需要编写带有limit关键字的SQL语句,数据库返回的就是分页结 ...

  6. 牛逼哄洪的 Java 8 Stream,性能也牛逼么?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 Java8的Stream API可以极大提高Java程序员的生产力 ...

  7. java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程

    在这篇教程中,将向你展示如何使用Java 8 Stream的Collectors,来对一个List进行分组,计算个数,求和以及排序. 1. Group By, Count and Sort 1.1 对 ...

  8. Java 8 Stream Api 中的 skip 和 limit 操作

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 1. 前言 Java 8 Stream API 中的sk ...

  9. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java 8引入 ...

最新文章

  1. python字典有什么用_在Python中使用范围作为字典键,我有什么选...
  2. idea编辑器无法识别jdk
  3. layer之jquery 弹窗插件 (最后版本v1.8.5)
  4. 串口发送通信---UART发送---STM32F4实现
  5. (转载)WebSphere MQ安装过程
  6. 行云管家堡垒机 导入腾讯云主机
  7. “云时代架构”经典文章阅读感想十六
  8. 贵州大学 c语言,贵州大学C语言 试卷.doc
  9. 阅读作业二-----读Lost in CatB有感 by 李栋
  10. Python返回Json格式定义的例子
  11. StreamSets实战之路(十五)-实战篇- 数据采集与处理
  12. java gui 数独_数独-GUI开发
  13. 小梅哥Xilinx FPGA学习笔记6——参数化设计及模块重用设计流水灯(跑马灯)
  14. qt中socket通信流程图_Qt学习 之 Socket通信(世界上最简单的例子了)
  15. 【产业互联网周报】AI独角兽们集体亮相安博会,侧重点各不相同;BAT智慧城市布局进一步加深...
  16. Timingdesigner入门 基础 教程
  17. Redis安装(Windows 最新版本redis 5.0.9,以及redis 4.0)
  18. 《iOS用户体验》总结与思考-改动版
  19. 对互联网行业的认知!
  20. 辽宁小学计算机课本,辽宁初中教材版本

热门文章

  1. 1284B. New Year and Ascent Sequence
  2. nginx 根证书 服务器证书,Nginx双向证书校验(服务器验证客户端证书)
  3. java中软填空面试题,通过这9个Java面试题,就可以入职华为啦
  4. 里怎么做页眉页脚_这年头县城里在家做的电商利润怎么样
  5. 用鼠标选择模型表面两点并连线
  6. wince6下usb摄像头(UVC)使用指南
  7. Wince6.0编译错误经验总结
  8. CTL_CODE说明
  9. vue 文件转换二进制_在vue中使用axios实现post方式获取二进制流下载文件(实例代码)...
  10. 【转】医学影像技术(中国普通高等学校本科专业)