如何通过 Stream.limit() 和 skip() 实现流的分页截取

来源:草根站长作者:马来西亚程序员头衔:程序员
导读:本期聚焦于小伙伴创作的《如何通过 Stream.limit() 和 skip() 实现流的分页截取》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何通过 Stream.limit() 和 skip() 实现流的分页截取》有用,将其分享出去将是对创作者最好的鼓励。

在Java的Stream API中,limit()skip()是两个常用的中间操作,二者配合可以轻松实现流的分页截取功能,无需手动遍历集合计算分页范围。

如何通过 Stream.limit() 和 skip() 实现流的分页截取

limit()和skip()方法基础说明

skip(long n)方法

skip()方法用于跳过流中的前n个元素,返回一个丢弃了前n个元素的新流。如果流中的元素数量小于n,会返回一个空流。该方法是惰性的,不会立即执行,只有在终止操作触发时才会生效。

limit(long maxSize)方法

limit()方法用于截断流,使流的最大长度不超过maxSize,返回一个包含原流中前maxSize个元素的新流。如果原流的元素数量小于maxSize,则返回原流。同样属于惰性操作,不会提前消费流数据。

分页截取的实现逻辑

要实现分页功能,需要明确两个核心参数:当前页码pageNum(从1开始计数)和每页显示数量pageSize。分页截取的计算逻辑如下:

  • 需要跳过的总元素数 = (pageNum - 1) * pageSize,这个值作为skip()的参数
  • 需要截取的元素总数 = pageSize,这个值作为limit()的参数

整体调用顺序为先调用skip()跳过前面的元素,再调用limit()截取当前页需要的元素,最后通过终止操作获取结果。

完整代码示例

以下是一个模拟用户列表分页的示例,假设有一个包含20个用户的集合,实现每页5条数据的分页查询:

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class StreamPageDemo {
    public static void main(String[] args) {
        // 模拟生成20个用户数据
        List<String> userList = new ArrayList<>();
        for (int i = 1; i <= 20; i++) {
            userList.add("用户" + i);
        }

        // 分页参数:查询第2页,每页5条数据
        int pageNum = 2;
        int pageSize = 5;

        // 计算需要跳过的元素数量
        long skipNum = (pageNum - 1) * pageSize;

        // 使用skip和limit实现分页截取
        List<String> pageData = userList.stream()
                .skip(skipNum)  // 跳过前5个元素(第1页的5条数据)
                .limit(pageSize) // 截取接下来的5个元素(第2页的5条数据)
                .collect(Collectors.toList());

        // 输出分页结果
        System.out.println("第" + pageNum + "页数据:");
        pageData.forEach(System.out::println);
    }
}

上述代码执行后,会输出用户6到用户10,符合第2页的分页预期。

注意事项和适用场景

  • 如果skip()的参数小于等于0,不会跳过任何元素;如果limit()的参数小于等于0,会返回空流。
  • 这两个方法适用于已经存在于内存中的集合数据的分页,如果是数据库查询等场景,优先使用数据库本身的分页语句,效率更高。
  • 流只能被消费一次,分页操作完成后如果需要再次分页,需要重新创建流。
  • skip()跳过的元素数量超过流的总长度时,后续limit()操作会返回空流,不会抛出异常。
需要注意的是,Stream的skip()limit()是有序操作,对于有序流(如从List生成的流),分页结果会和原始集合的顺序保持一致;对于无序流(如从Set生成的流),分页结果的元素顺序可能不固定。

Stream_limitStream_skip流分页Java_stream修改时间:2026-07-01 06:03:24

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。