龙空技术网

业务二三事——下游接口限制查询数量怎么办?

避夏 140

前言:

如今咱们对“list比较大小返回最大”都比较重视,大家都想要分析一些“list比较大小返回最大”的相关内容。那么小编在网络上网罗了一些关于“list比较大小返回最大””的相关文章,希望同学们能喜欢,你们快快来了解一下吧!

背景

在实际开发中,分页查询接口通常会设置单次查询的最大数目,有时下游接口的最大数目限制不能满足我们的业务场景需求,只能通过多次调用进行数据的查询获取(PS:此类方法的适用场景是总数据量不大的离线任务,不建议在即时查询接口中使用该方法),这种实现逻辑大致相同,将待查询的数据进行切分,分批进行查询,然后组合成最后的查询结果,因此可以尝试抽象出工具类。

现状

假设现在有如下的场景,下游有一个服务可以将List<String>转化成List<Integer>返回,但是每次最大转化数量限制为2;

  public List<Integer> toIntegers(List<String> list) {        if (list == null || list.size() > 2) {            throw new IllegalArgumentException();        }        return list.stream().map(Integer::valueOf).collect(Collectors.toList());    }

当有一个数组大小为5的集合,就需要手动进行分页,分批次调用接口;

  @Test    public void testOriginal() {        List<String> stringList = Arrays.asList("1", "2", "3", "4", "5");        List<Integer> result = convertListOriginal(stringList);        log.info("result = {}", result);    }     public List<Integer> convertListOriginal(List<String> stringList) {        List<Integer> result = new ArrayList<>();        int pageSize = 2;        int fromIndex = 0;        while (fromIndex < stringList.size()) {            int toIndex = Math.min(fromIndex + pageSize, stringList.size());            List<String> subList = stringList.subList(fromIndex, toIndex);            List<Integer> subResult = toIntegers(subList);            if (CollectionUtils.isNotEmpty(subResult)) {                result.addAll(subResult);            }            fromIndex = toIndex;        }        return result;    }

在其他情况下,遇到这种场景,仍需要将相应的代码逻辑拷贝一份,进行修改,这样就会显得代码过于冗余,因此,尝试进行抽象;

抽象

把对subList进行处理的方法抽象出来,作为一个Function传入

public class PageQueryUtil {    private static final int default_page_size = 50;    public static <T, R> List<R> handleListByPage(@NotNull List<T> list,                                                  @NotNull Function<List<T>, List<R>> function) {        return handleListByPage(list, function, default_page_size);    }    @Nullable    public static <T, R> List<R> handleListByPage(@NotNull List<T> list,                                                  @NotNull Function<List<T>, List<R>> function,                                                  @Nullable Integer pageSize) {        if (CollectionUtils.isEmpty(list)) {            return null;        }        pageSize = pageSize == null ? default_page_size : pageSize;        List<R> result = new ArrayList<>();        int fromIndex = 0;        while (fromIndex < list.size()) {            int toIndex = Math.min(fromIndex + pageSize, list.size());            List<T> subList = list.subList(fromIndex, toIndex);            List<R> subResult = function.apply(subList);            if (CollectionUtils.isNotEmpty(subResult)) {                result.addAll(subResult);            }            fromIndex = toIndex;        }        return result;    }}}

同时改造原方法

 @Test    public void testOriginal() {        List<String> stringList = Arrays.asList("1", "2", "3", "4", "5");        Function<List<String>, List<Integer>> function = this::toIntegers;        List<Integer> newResult =                PageQueryUtil.handleListByPage(stringList, function, 2);        log.info("new result = {}", newResult);    }

经过这样简单的抽象,就可以在后续类似场景下直接传入待处理的列表,以及单次查询的限制大小,还有对列表数据的处理函数,得到最后的处理结果;

总结

抽象出一个分页查询聚合的PageQueryUtil,可以通过该工具类简化对下游查询接口多次调用结果的聚合;

适用场景:

离线任务中或是时延不敏感的接口;下游接口对单次查询数据量有限制,不能满足业务场景需求,且不愿意调整上限;

标签: #list比较大小返回最大