我们如何在 Java 8 中创建批量的 Arraylist?
How can we create batches of Arraylist in Java 8?
我得到了包含 1000 个元素的对象的数组列表,我想创建 100 个元素的批次。
如何以优雅的方式在 java 8 中做到这一点?
我有以下要迭代的实体,其大小为 1000:
List<CustomerAgreement> customerAgreement
现在我将在上面调用以下方法
customerAgreementDao.createAll(customerAgreement);
customerAgreementDao.flush();
如何从上述实体创建批次并在该批次中调用上述两种方法?
目前的标准做法有点像:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<888888; i++ ) {
TableA record = new TableA();
record.setXXXX();
session.save(record)
if ( i % 50 == 0 ) {
session.flush();
session.clear();
}
}
tx.commit();
session.close();
int itemsPerBatch = 100;
int totalBatches = (customerAgreements.size()+itemsPerBatch-1)/itemsPerBatch;
int offset = 0;
for(int i=0; i<totalBatches; i++) {
List<String> currentBatch = customerAgreements.subList(offset, Math.min(offset+itemsPerBatch, customerAgreements.size()));
offset+=itemsPerBatch;
}
我自己会使用 List.subList
,因为我不太喜欢 lambda;在我看来,它们通常会降低您的代码的可读性。
这应该可行 - 如果您不介意,我已经缩减了数组:
// create list as demo
var list = new ArrayList<String>();
for (int i = 0; i < 13; i++) {
list.add(Integer.toString(i));
}
int batchSize = 3;
// the code
int offset = 0;
while (offset < list.size()) {
// make sure the end offset doesn't go past the end
int endOffset = Math.min(offset + batchSize, list.size());
// call or add it to anything else, or even use streaming afterwards
System.out.println(list.subList(offset, endOffset));
offset = endOffset;
}
结果
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9, 10, 11]
[12]
注意子列表是不是副本,对列表中对象的任何更改都将反映在子列表中,而对原始列表的结构更改(调整大小)将结果,好吧,可能一团糟。反之亦然,尽管 subList
的结构变化是可能的。
我得到了包含 1000 个元素的对象的数组列表,我想创建 100 个元素的批次。
如何以优雅的方式在 java 8 中做到这一点?
我有以下要迭代的实体,其大小为 1000:
List<CustomerAgreement> customerAgreement
现在我将在上面调用以下方法
customerAgreementDao.createAll(customerAgreement);
customerAgreementDao.flush();
如何从上述实体创建批次并在该批次中调用上述两种方法?
目前的标准做法有点像:
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<888888; i++ ) {
TableA record = new TableA();
record.setXXXX();
session.save(record)
if ( i % 50 == 0 ) {
session.flush();
session.clear();
}
}
tx.commit();
session.close();
int itemsPerBatch = 100;
int totalBatches = (customerAgreements.size()+itemsPerBatch-1)/itemsPerBatch;
int offset = 0;
for(int i=0; i<totalBatches; i++) {
List<String> currentBatch = customerAgreements.subList(offset, Math.min(offset+itemsPerBatch, customerAgreements.size()));
offset+=itemsPerBatch;
}
我自己会使用 List.subList
,因为我不太喜欢 lambda;在我看来,它们通常会降低您的代码的可读性。
这应该可行 - 如果您不介意,我已经缩减了数组:
// create list as demo
var list = new ArrayList<String>();
for (int i = 0; i < 13; i++) {
list.add(Integer.toString(i));
}
int batchSize = 3;
// the code
int offset = 0;
while (offset < list.size()) {
// make sure the end offset doesn't go past the end
int endOffset = Math.min(offset + batchSize, list.size());
// call or add it to anything else, or even use streaming afterwards
System.out.println(list.subList(offset, endOffset));
offset = endOffset;
}
结果
[0, 1, 2]
[3, 4, 5]
[6, 7, 8]
[9, 10, 11]
[12]
注意子列表是不是副本,对列表中对象的任何更改都将反映在子列表中,而对原始列表的结构更改(调整大小)将结果,好吧,可能一团糟。反之亦然,尽管 subList
的结构变化是可能的。