Java Stream API实现内存分页查询

最近工作中涉及到一点内存分页查询,于是就针对Java 8流实现内存分页进行整理。

截短流

Stream API中的limit(n)方法,会返回另一个不超过给定长度的流,实现流的截短。如果流是有序的,例如List源构建的流,那么会截短前最多n个元素到新的流中;如果流是无序的,例如Set源构建的流,那么截短的元素不会以任何顺序排列。

1
2
3
4
List<User> userList = list.stream()
.filter(user -> user.getId() > 2)
.limit(5)
.collect(Collectors.toList());

运行结果

image-20211017215706950

跳过元素

Stream API中的skip(n)方法,会返回另一个去掉前n个元素的流。如果流中元素不足n个,则返回一个空流。

1
2
3
4
List<User> userList = list.stream()
.filter(user -> user.getId() > 2)
.skip(5)
.collect(Collectors.toList());

运行结果

image-20211017215515960

内存分页

通过Stream API中的skip(m)limit(n)方法互补配合,就能实现内存分页查询。

1
2
3
4
5
6
7
public List<User> pageQuery(int pageNo, long pageSize) {
List<User> list = userMapper.selectAllUser();
return list.stream()
.skip((pageNo - 1) * pageSize)
.limit(pageSize)
.collect(Collectors.toList());
}

运行结果

image-20211017222148789

参考

  • 《Java实战》第二版