Esta publicación discutirá cómo dividir una lista en sublistas de tamaño n en Java. Tenga en cuenta que la lista final puede ser más pequeña que n dependiendo del tamaño de la lista.

1. Usar Guava

Con la biblioteca Guava, puede usar el Lists.partition() para dividir una lista en sublistas consecutivas, cada una del tamaño especificado. El siguiente es un ejemplo simple que demuestra el uso de este método:

Descargar Código

Resultado:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15]]

2. Uso de las colecciones de Apache Commons

Similar a la de Guava Lists.partition() método, Colecciones de Apache Commons ListUtils ofertas de clases partition() método que ofrece una funcionalidad similar.

Descargar Código

Resultado:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15]]

3. Usando List.subList() método

Si no prefiere bibliotecas de terceros, puede escribir su propia rutina para esta tarea. Las siguientes soluciones utilizan un ciclo for regular para iterar la lista y el List.subList() método para obtener la partición entre el índice inicial y el final.

Descargar  Ejecutar código

Resultado:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15]]

 
Esto es equivalente a lo siguiente usando Java 8 Stream API:

Descargar  Ejecutar código

Resultado:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15]]

 
Finalmente, con Java 9 puedes simplificar el código usando el IntStream.iterate() método que toma un predicado.

Descargar  Ejecutar código

Resultado:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15]]

4. Uso Collectors.groupingBy() método

Hay más formas de dividir una lista en Java utilizando Stream API. La siguiente solución utiliza Collectors.groupingBy() para realizar el equivalente de una operación de "agrupar por" en los elementos de la lista. Agrupa los elementos según una función de clasificación y devuelve los resultados en un mapa.

Descargar  Ejecutar código

Resultado:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15]]

 
El código se puede simplificar usando un contador mutable como AtomicInteger clase:

Descargar  Ejecutar código

Resultado:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15]]

Se trata de dividir una lista en sublistas de tamaño n en Java.