BiConsumer是一个函数式接口,代表一个接受两个输入参数且不返回任何内容的操作符
java
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiConsumer;
public class BatchOperate<T> {
private int batchSize=3000;
private List<T> content=new ArrayList<>();
private BiConsumer<Integer,List<T>> consumer;
private int pageNo;
private long total;
public void setConsumer(BiConsumer<Integer,List<T>> consumer){
this.consumer=consumer;
}
public void setBatchSize(int batchSize) {
this.batchSize = batchSize;
}
public void addBatch(T t){
this.content.add(t);
this.total++;
if (content.size()>=batchSize){
this.executeBatch();
}
}
public long getTotal() {
return total;
}
public void executeBatch() {
if(this.content.size()>0){
pageNo++;
consumer.accept(this.pageNo,this.content);
this.content=new ArrayList<>();
}
}
}
使用:
java
private void processUser(){
int size = 1000;
BatchOperate<User> batchOperate = new BatchOperate<>();
batchOperate.setBatchSize(size);
batchOperate.setConsumer((index, list) -> {
log.info("######处理用户信息:{}", index);
removeUserInfo(list);
});
for(int i=0; i < 9000; i++){ //生成用户放到 batchOperate
User user = new User();
batchOperate.addBatch(user);
}
batchOperate.executeBatch();
}
private void removeUserInfo(List<user> userList){
//处理逻辑
System.out.println(userList.size());
}