public abstract class SubLevel<R> {
public static <R, T extends SubLevel<R> > void invokeSub(Class<T> clazz, SubPage subPage, Function<SubPage, List<R>> function, Consumer<List<R>> levelData) throws InstantiationException, IllegalAccessException {
T t = clazz.newInstance();
t.subPage = subPage;
t.levelDataConsumer = levelData;
t.function = function;
t.invokeSub();
}
protected void invokeSub() {
while (true) {
List<R> subList = function.apply(subPage);
if (subList == null || subList.size() == 0) {
break;
}
levelDataConsumer.accept(subList);
if (subPage.getPageSize() > subList.size()) {
break;
}
subPage.cutPage(cutPage(subList.get(subList.size() - 1)));
}
}
protected abstract Long cutPage(R r);
@Getter
@Setter
public static class SubPage {
private int pageSize;
private Long beginId;
private long lastMaxId;
public void cutPage(Long lastId) {
this.beginId = lastId;
}
private SubPage() {
}
}
protected Function<SubPage, List<R>> function;
protected Consumer<List<R>> levelDataConsumer;
protected SubPage subPage;
public static SubPage page(long beginId, int size){
SubPage page = new SubPage();
page.setBeginId(beginId);
page.setPageSize(size);
return page;
}
}
public class SubPerson extends SubLevel<Person>{
@Override
protected Long cutPage(Person person) {
return person.getId();
}
}
@Component
public class SubMain {
@Resource
private PersonService personService;
public void testPage() throws Exception {
SubPerson.invokeSub( SubPerson.class, SubLevel.page(0L,10), subPage -> personService.page(subPage.getBeginId(), subPage.getPageSize()), System.out::println);
}
}