Eu mesmo escrevi um utilitário para dividir uma lista em lotes de determinado tamanho. Eu só queria saber se já existe algum utilitário apache commons para isso.
public static <T> List<List<T>> getBatches(List<T> collection,int batchSize){
int i = 0;
List<List<T>> batches = new ArrayList<List<T>>();
while(i<collection.size()){
int nextInc = Math.min(collection.size()-i,batchSize);
List<T> batch = collection.subList(i,i+nextInc);
batches.add(batch);
i = i + nextInc;
}
return batches;
}
Por favor, deixe-me saber se já existe algum utilitário para o mesmo.
java
collections
Harish
fonte
fonte
Respostas:
Confira a partir Google Guava :
Lists.partition(java.util.List, int)
fonte
partition documentation
e ligaçãocode example
Caso você queira produzir um fluxo de lotes Java-8, tente o seguinte código:
Resultado:
fonte
Outra abordagem é usar
Collectors.groupingBy
índices e, em seguida, mapear os índices agrupados para os elementos reais:Resultado:
fonte
groupingBy
é feito nos elementos doIntStream.range
, não nos elementos da lista. Veja, por exemplo, ideone.com/KYBc7h .Eu vim com este:
fonte
Com o Java 9, você pode usar
IntStream.iterate()
comhasNext
condição. Então você pode simplificar o código do seu método para isso:Usando
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
, o resultado degetBatches(numbers, 4)
será:fonte
O exemplo a seguir demonstra a divisão de uma lista:
Resultado:
fonte
Havia outra pergunta que foi encerrada como duplicada, mas se você ler de perto, é sutilmente diferente. Portanto, caso alguém (como eu) realmente queira dividir uma lista em um determinado número de sublistas de tamanho quase igual e depois continue lendo.
Eu simplesmente portava o algoritmo descrito aqui para Java.
fonte
Use o Apache Commons ListUtils.partition .
fonte
Usando vários truques da web, cheguei a esta solução:
Usamos count para imitar um índice de coleção normal.
Em seguida, agrupamos os elementos de coleção em buckets, usando o quociente algébrico como número do bucket.
O mapa final contém como chave o número do depósito, como valor o próprio depósito.
Você pode facilmente executar uma operação em cada um dos buckets com:
fonte
AtomicInteger
para contagem.fonte
Semelhante ao OP sem fluxos e bibliotecas, mas conciso:
fonte
Outra abordagem para resolver isso, pergunta:
fonte
Um one-liner no Java 8 seria:
fonte
Aqui está uma solução simples para Java 8+:
fonte
Você pode usar o código abaixo para obter o lote da lista.
Você precisa importar a biblioteca do Google Guava para usar o código acima.
fonte
import com.google.common.collect.Lists;
List<List<T>> batches = Lists.partition(List<T>,batchSize)
Use Lists.partition (List, batchSize). Você precisa importar
Lists
do pacote comum do google (com.google.common.collect.Lists
)Ele retornará a lista de
List<T>
com e o tamanho de cada elemento igual ao seubatchSize
.fonte
subList(startIndex, endIndex)
método para quebrar a lista com base no índice necessário.