lambda表达式本身不支持分页或类型转换,仅作为函数式接口的语法糖;分页需用sublist()或stream的skip()+limit(),转换依赖map()配合构造器引用或lambda表达式。

Java 中 Lambda 表达式本身不直接支持分页或类型转换,它只是简化函数式接口实现的语法糖。真正的分页与转换需要结合 List 操作、Stream API 和工具类(如 Collectors)来完成。关键在于:Lambda 用在过滤、映射、排序等环节,而分页需手动计算索引范围,转换则靠 map() 配合构造器或方法引用。
用 Stream 实现列表分页(基于索引)
Java 的 List 没有内置分页方法,但可通过 subList() 或 Stream 的 skip() + limit() 实现。后者更契合 Lambda 风格,且支持链式操作:
- 分页前建议先用
stream().filter(...).sorted(...)处理原始数据,再分页,避免对未过滤全量数据分页 -
skip(offset)跳过前 offset 条,limit(size)取最多 size 条,组合起来就是“第 page 页,每页 size 条”(page 从 0 开始) - 注意:Stream 分页不是数据库级优化,仍会遍历跳过的元素,大数据量时慎用;生产环境推荐在 DAO 层用 MyBatis/JPQL 分页
用 Lambda 进行对象类型转换(DTO ↔ Entity)
常见场景是把 List<userentity></userentity> 转为 List<userdto></userdto>。Lambda 主要用于 map() 中定义转换逻辑:
- 用构造器引用:
list.stream().map(UserDTO::new).collect(Collectors.toList())(要求 DTO 有对应参数构造器) - 用方法引用或表达式:
list.stream().map(u -> new UserDTO(u.getId(), u.getName().toUpperCase())).collect(Collectors.toList()) - 可组合过滤与转换:
list.stream().filter(u -> u.isActive()).map(UserDTO::new).collect(Collectors.toList())
分页 + 转换一体化写法(推荐封装)
实际开发中常将分页和转换合并处理,避免中间集合创建。可封装成通用方法:
public static <t r> List<r> paginateAndMap(List<t> source, int page, int size, Function<t r> mapper) {
int fromIndex = page * size;
int toIndex = Math.min(fromIndex + size, source.size());
if (fromIndex >= source.size()) return Collections.emptyList();
return source.subList(fromIndex, toIndex)
.stream()
.map(mapper)
.collect(Collectors.toList());
}</t></t></r></t>
调用示例:paginateAndMap(users, 2, 10, u -> new UserVO(u.getId(), u.getNick())) —— 第 3 页(page=2),每页 10 条,同时转成 VO。
注意事项与避坑点
使用 Lambda 做分页转换时容易忽略的细节:
-
subList()返回的是原 List 的视图,修改会影响原集合;如需独立副本,加new ArrayList(list.subList(...)) - Stream 的
skip/limit对并行流(parallelStream())行为不可控,分页务必用串行流 - 空集合或越界索引需主动判空或校验,
subList(from, to)在from > to或越界时抛IndexOutOfBoundsException - 若需带总记录数的分页结果(如 Page
),Lambda 无法替代 PageHelper 或 Spring Data 的 Page类,应配合其 API 使用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











