具有批处理功能的 Java 8 流

2022-08-31 08:58:50

我有一个大文件,其中包含一个项目列表。

我想创建一批项目,用这个批次发出HTTP请求(所有项目都需要作为HTTP请求中的参数)。我可以通过循环非常容易地做到这一点,但是作为Java 8的爱好者,我想尝试使用Java 8的Stream框架来编写它(并从惰性处理中获益)。for

例:

List<String> batch = new ArrayList<>(BATCH_SIZE);
for (int i = 0; i < data.size(); i++) {
  batch.add(data.get(i));
  if (batch.size() == BATCH_SIZE) process(batch);
}

if (batch.size() > 0) process(batch);

我想做一些长线的事情lazyFileStream.group(500).map(processBatch).collect(toList())

最好的方法是什么?


答案 1

为了完整起见,这是一个番石榴解决方案。

Iterators.partition(stream.iterator(), batchSize).forEachRemaining(this::process);

在问题中,集合是可用的,因此不需要流,它可以写成,

Iterables.partition(data, batchSize).forEach(this::process);

答案 2

纯 Java-8 实现也是可能的:

int BATCH = 500;
IntStream.range(0, (data.size()+BATCH-1)/BATCH)
         .mapToObj(i -> data.subList(i*BATCH, Math.min(data.size(), (i+1)*BATCH)))
         .forEach(batch -> process(batch));

请注意,与JOOl不同,它可以很好地并行工作(前提是您是随机访问列表)。data


推荐