Java 深分页段处理数据

122 阅读1分钟
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);  
  
}  
  
}