Java 8流与批处理

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

我想创建一批项目,使用此批处理(所有项目都需要作为HTTP请求中的参数)的HTTP请求。我可以很容易地用一个for循环,但作为Java 8的爱人,我想尝试写这个与Java 8的Stream框架(并收获懒惰处理的好处)。

例:

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())

什么是最好的方法做到这一点?

你可以使用jOOλ,一个库扩展Java 8流的单线程,顺序流用例:

Seq.seq(lazyFileStream)              // Seq<String>
   .zipWithIndex()                   // Seq<Tuple2<String, Long>>
   .groupBy(tuple -> tuple.v2 / 500) // Map<Long, List<String>>
   .forEach((index, batch) -> {
       process(batch);
   });

幕后,zipWithIndex()只是:

static <T> Seq<Tuple2<T, Long>> zipWithIndex(Stream<T> stream) {
    final Iterator<T> it = stream.iterator();

    class ZipWithIndex implements Iterator<Tuple2<T, Long>> {
        long index;

        @Override
        public boolean hasNext() {
            return it.hasNext();
        }

        @Override
        public Tuple2<T, Long> next() {
            return tuple(it.next(), index++);
        }
    }

    return seq(new ZipWithIndex());
}

…而groupBy()是API方便:

default <K> Map<K, List<T>> groupBy(Function<? super T, ? extends K> classifier) {
    return collect(Collectors.groupingBy(classifier));
}

(免责声明:我为公司背后的jOOλ工作)

http://stackoverflow.com/questions/30641383/java-8-stream-with-batch-processing

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Java 8流与批处理