Java中使用List的stream流实现分页,有时候我们的需求并不能使用mybatis或mysql去实现分页,我们就需要处理好数据后使用stream流去处理分页

使用 skip() 和 limit() 方法。skip(n) 方法用于跳过前 n 个元素,而 limit(n) 方法用于限制元素的数量为 n。结合这两个方法,你可以实现分页效果。

假设我们有一个 List<CuringLandInfo> 类型的列表 curingLandInfoList,现在要实现分页效果,可以按以下步骤操作:

  1. 计算要跳过的元素数量(即页数乘以每页大小)。
  2. 使用 skip() 方法跳过计算出的元素数量。
  3. 使用 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;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

令人作呕的溏心蛋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值