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