All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.pivovarit.collectors.BatchingStream Maven / Gradle / Ivy

There is a newer version: 3.2.0
Show newest version
package com.pivovarit.collectors;

import java.util.Iterator;
import java.util.List;
import java.util.stream.Stream;

import static java.lang.Runtime.getRuntime;
import static java.util.Spliterator.ORDERED;
import static java.util.Spliterators.spliteratorUnknownSize;
import static java.util.stream.StreamSupport.stream;

final class BatchingStream implements Iterator> {

    private final List source;
    private final int size;

    private int chunks;
    private int chunkSize;
    private int leftElements;
    private int i;

    private BatchingStream(List list, int numberOfParts) {
        source = list;
        size = list.size();
        chunks = numberOfParts;
        chunkSize = (int) Math.ceil(((double) size) / numberOfParts);
        leftElements = size;
    }

    private static  Iterator> from(List source, int chunks) {
        return new BatchingStream<>(source, chunks);
    }

    static int defaultBatchAmount() {
        return Math.max(getRuntime().availableProcessors() - 1, 1);
    }

    static  Stream> partitioned(List list, int numberOfParts) {
        return stream(spliteratorUnknownSize(from(list, numberOfParts), ORDERED), false);
    }

    @Override
    public boolean hasNext() {
        return i < size && chunks != 0;
    }

    @Override
    public List next() {
        List batch = source.subList(i, i + chunkSize);
        i = i + chunkSize;
        leftElements = leftElements - chunkSize;
        chunkSize = (int) Math.ceil(((double) leftElements) / --chunks);
        return batch;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy