import java.util.*;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
@SuppressWarnings("unused")
public class StreamUtil {
public StreamUtil() {
throw new RuntimeException("Util Class");
}
public synchronized static <T> void batches(int batchSize, final Iterable<T> data, Consumer<List<T>> func) {
if (Objects.nonNull(data) && data.iterator().hasNext()) {
AtomicInteger count = new AtomicInteger(0);
AtomicBoolean first = new AtomicBoolean(Boolean.TRUE);
List<T> splitData = new ArrayList<>(batchSize);
for (T datum : data) {
if (first.get()) {
splitData.add(datum);
if (splitData.size() >= batchSize) {
first.set(Boolean.FALSE);
func.accept(splitData);
}
} else {
splitData.set(count.get(), datum);
if (count.incrementAndGet() >= batchSize) {
func.accept(splitData);
count.set(0);
}
}
}
if (first.get()) {
func.accept(splitData);
} else {
if (count.get() > 0 && count.get() < batchSize) {
func.accept(splitData.subList(0, count.get()));
}
}
}
}
}
分批插入数据库
于 2023-01-31 19:34:30 首次发布