【问题标题】:How can we create batches of Arraylist in Java 8?我们如何在 Java 8 中创建批量 Arraylist?
【发布时间】:2019-11-29 04:40:01
【问题描述】:

我得到了 1000 个元素的对象的 Arraylist,我想创建 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();

【问题讨论】:

  • @MaartenBodewes:也更新了数据库的标签,但在这里我只是在寻找 Java 8 创建批次的方法。我认为这是数据库是其中之一的一般情况。谢谢
  • 由于您正在执行终端操作并且您没有返回任何内容,在这种情况下您可以根据您的需要设计Consumer
  • 我可以尝试制作一个。在此之前检查Stream#forEach(),这与您正在寻找的类似
  • @fatherazrael 这将是一种解决方法是的。毫无疑问,还有其他人,甚至可能包括 lambda,因为它们会试图向您展示。
  • 我同意@MaartenBodewes。我唯一需要的是为您的代码参考提供一些花哨的、有缺陷的实现,这里是:public void consumerTest() { AtomicInteger ai = new AtomicInteger(0); IntStream.range(0, 100).boxed().map(Table::new) .forEach(r -&gt; this.forEachConsumer(r, ai.addAndGet(1))); } public void forEachConsumer(Table table, Integer counter) { System.out.println(counter); if (counter % 30 == 0) { System.err.println(counter); } },我不会在生产环境中推荐此代码

标签: java hibernate java-8 batch-insert


【解决方案1】:

我自己会使用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 的结构更改是可能的。

【讨论】:

  • 嗯,很明显,更改任何非不可变对象,例如 Java String。没有黑色艺术就无法改变那些。
【解决方案2】:
    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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多