使用 skip() 和 limit() 方法。skip(n) 方法用于跳过前 n 个元素,而 limit(n) 方法用于限制元素的数量为 n。结合这两个方法,你可以实现分页效果。
假设我们有一个 List<CuringLandInfo> 类型的列表 curingLandInfoList,现在要实现分页效果,可以按以下步骤操作:
- 计算要跳过的元素数量(即页数乘以每页大小)。
- 使用 skip() 方法跳过计算出的元素数量。
- 使用 limit() 方法限制结果的大小为每页大小。
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
// 假设有一个包含 20 个元素的 curingLandInfoList
List<CuringLandInfo> curingLandInfoList = new ArrayList<>();
// 假设每页大小为 5
int pageSize = 5;
// 假设要获取第 3 页的数据
int page = 3;
// 计算要跳过的元素数量
int skipElements = (page - 1) * pageSize;
// 使用 Stream 实现分页
List<CuringLandInfo> pageData = curingLandInfoList.stream()
.skip(skipElements) // 跳过前 skipElements 个元素
.limit(pageSize) // 限制结果数量为 pageSize
.toList(); // 将结果收集为列表
// 输出分页数据
pageData.forEach(System.out::println);
}
}
Java 9 或更高版本中使用 toList() 方法。如果你使用的是 Java 8,则可以使用 collect(Collectors.toList()) 方法来替换 toList()。
出现Cannot resolve method 'toList' in 'Stream'
的解决方法:
将.toList() 替换成 .collect(Collectors.toList());
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// 假设有一个包含 20 个元素的 curingLandInfoList
List<CuringLandInfo> curingLandInfoList = new ArrayList<>();
// 假设每页大小为 5
int pageSize = 5;
// 假设要获取第 3 页的数据
int page = 3;
// 计算要跳过的元素数量
int skipElements = (page - 1) * pageSize;
// 使用 Stream 实现分页
List<CuringLandInfo> pageData = curingLandInfoList.stream()
.skip(skipElements) // 跳过前 skipElements 个元素
.limit(pageSize) // 限制结果数量为 pageSize
.collect(Collectors.toList()); // 使用 Collectors.toList() 收集结果为列表
// 输出分页数据
pageData.forEach(System.out::println);
}
}
实际开发中使用示例
@Override
public Map<String,Object> getRoadList(String roadName, Query query) {
Map<String, Object> map = new HashMap<>();
LambdaQueryWrapper<CuringLandInfo> wrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotEmpty(roadName)){
wrapper.like(CuringLandInfo::getRoadName,roadName);
}
//先查出所有数据
List<CuringLandInfo> curingLandInfoList = curingLandInfoService.list(wrapper);
//List存储
List<CuringLandInfo> curingLandInfoCopyList = new ArrayList<>();
//按照需求处理数据,并把对象add到List里,方便后续进行stream分页
for (CuringLandInfo curingLandInfo : curingLandInfoList) {
List<CuringLandIntervalInfo> curingLandIntervalInfoList = curingLandIntervalInfoMapper.selectList(new LambdaQueryWrapper<CuringLandIntervalInfo>().eq(CuringLandIntervalInfo::getCuringLandInfoId, curingLandInfo.getId()));
curingLandIntervalInfoList.forEach(curingLandIntervalInfo -> {
if (StringUtils.isNotEmpty(curingLandIntervalInfo.getGeom())){
curingLandIntervalInfo.setGeom(curingLandInfoMapper.formatGeom(curingLandIntervalInfo.getGeom()));
}
CuringLandInfo curingLandInfoCopy = new CuringLandInfo();
BeanUtils.copyProperties(curingLandInfo,curingLandInfoCopy);
curingLandInfoCopy.setGeom(curingLandIntervalInfo.getGeom());
curingLandInfoCopy.setIntervalId(curingLandIntervalInfo.getIntervalId());
curingLandInfoCopy.setQjId(curingLandIntervalInfo.getId());
curingLandInfoCopy.setIntervalStartEnd(curingLandIntervalInfo.getIntervalStartEnd());
curingLandInfoCopyList.add(curingLandInfoCopy);
});
}
// 使用 Stream 实现分页
List<CuringLandInfo> pageData = curingLandInfoCopyList.stream()
.skip((long) (query.getCurrent() - 1) * query.getSize()) // 跳过前 x 个元素
.limit(query.getSize()) // 限制结果数量为 size
.collect(Collectors.toList()); // 将结果收集为列表
map.put("list",pageData);
map.put("total",curingLandInfoCopyList.size());
return map;
}