java中对内存中的List集合进行模糊查询与分页的一种方式

背景

之前有个数据存在redis里,获取的时候直接给所有,现在需要优化,故加上对查询条件和分页的支持

代码样例

controller层

在这里插入图片描述

## 代码

@Slf4j
@RequestMapping("/demo")
@RestController
public class WebController {

    @Autowired
    private WebService webService;

    /**
     * demo
     *
     * @return
     */
    @PostMapping("/gateways/page")
    public TableDataInfo page(@RequestBody(required = false) BaseProtocolConfigDto config) {
        DriverPage<BaseProtocolConfig> page = webService.page(config);
        return getDataTable(page);
    }


    /**
     * 响应请求分页数据 - demo
     * @param page
     * @return
     */
    protected TableDataInfo getDataTable(DriverPage<?> page)
    {
        TableDataInfo rspData = new TableDataInfo();
        rspData.setCode(HttpStatus.HTTP_OK);
        rspData.setRows(page.getList());
        rspData.setTotal(page.getTotal());
        return rspData;
    }

}

service层

先获取所有
在这里插入图片描述

    ## 代码

    @Override
    public List<BaseProtocolConfig> gatewayList(BaseProtocolConfigDto config) {

        //存放最终结果
        List<BaseProtocolConfig> gateways = supBoxList();
        if (StringUtil.isEmpty(gateways)) {
            log.error("未检测到协议配置信息");
            return null;
        }
        //条件执行
        List<BaseProtocolConfig> list = gateways.stream()

                .filter(way -> {
                    //网关名称
                    return (
                           (StringUtil.isEmpty(config.getClientName()) || (way.getClientName().contains(config.getClientName())) )
                            &&
                           (StringUtil.isEmpty(config.getIp()) ||  (way.getIp().contains(config.getIp())) )
                            &&
                           (StringUtil.isNull(config.getPort()) || config.getPort().equals(way.getPort()))
                            &&
                           (StringUtil.isEmpty(config.getType()) || (way.getType().contains(config.getType())) )
                            &&
                           (StringUtil.isNull(config.getStatus()) || config.getStatus().equals(way.getStatus()))
                    );

                }).sorted(Comparator.comparing( BaseProtocolConfig::getIp).thenComparing(BaseProtocolConfig::getType))
                .collect(Collectors.toList());
        return list;
    }

再分页
在这里插入图片描述

    ## 代码
    @Override
    public DriverPage<BaseProtocolConfig> page(BaseProtocolConfigDto dto) {
        DriverPage<BaseProtocolConfig> customPage = new DriverPage<>();
        List<BaseProtocolConfig> configs = gatewayList(dto);

        if ( Objects.isNull(dto.getPage()) ) {
            Pages page = new Pages();
            dto.setPage(page);
        }
        int start = ( dto.getPage().getPageNum() - 1 ) * dto.getPage().getPageSize();
        int end =  ( dto.getPage().getPageNum() ) * dto.getPage().getPageSize();
        int total = configs.size();
        List<BaseProtocolConfig> subList = Lists.newArrayList();

        if( start > total ){
            // 初始值大于集合最大长度
            log.info("分页结果不存在");
        }else if (start <= total && end > total ){
            // 初始值小于集合最大长度,结束值大于集合最大长度
            subList = configs.subList(start, total );
        }else{
            // 正常情况
            subList = configs.subList(start, end);
        }
        customPage.setList(subList);
        customPage.setTotal(configs.size());
        return customPage;
    }

使用的bean


在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值