由于微服务的性能要求,大部分接口对调用做了数量限制,但是在调用时超过限制数量时,就只有通过分页的方式调用。

对于List比较好的分页方式就是使用Lists工具包中的Partition方法调用,但是今天在使用时,发现接口调用时发生异常。debug发现是subList导致的。subList的实现逻辑就不谈了,往上追溯发现是Partition方式也使用了subList,所以导致问题发生。

public static <T> List<List<T>> partition(List<T> list, int size) {
    checkNotNull(list);
    checkArgument(size > 0);
    return (list instanceof RandomAccess)
        ? new RandomAccessPartition<T>(list, size)
        : new Partition<T>(list, size);
  }

  private static class Partition<T> extends AbstractList<List<T>> {
    final List<T> list;
    final int size;

    Partition(List<T> list, int size) {
      this.list = list;
      this.size = size;
    }

    @Override
    public List<T> get(int index) {
      checkElementIndex(index, size());
      int start = index * size;
      int end = Math.min(start + size, list.size());
      return list.subList(start, end);
    }

    @Override
    public int size() {
      return IntMath.divide(list.size(), size, RoundingMode.CEILING);
    }

    @Override
    public boolean isEmpty() {
      return list.isEmpty();
    }
  }

对于这种问题,有两种解决方案:

(1)使用Lists.newArrayList(list)重新建一个list

(2)在接口设计时,参数尽量使用Array,而不是list

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐