- Uso de PageInfo para encapsular datos de paginación
El método más recomendado consiste en emplear la clase PageInfo de la librería PageHelper. Esta proporciona una estructura completa que incluye el total de registros, los elementos de la página solicitada, el número de página actual y el tamaño de página confgiurado.
Para utilizarla, es necesario añadir la siguiente dependencia en el archivo POM:
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.0.1</version>
</dependency>
Implementación con PageInfo
/**
* Obtiene un objeto PageInfo que contiene los datos de una página específica.
* @param paginaNumero Número de la página a recuperar (comienza en 1)
* @param elementosPorPagina Cantidad de elementos por página
* @param datosOriginales Lista completa de datos
* @param <T> Tipo genérico de los elementos
* @return Objeto PageInfo con la información de paginación
*/
public static <T> PageInfo<T> obtenerPaginaInfo(int paginaNumero, int elementosPorPagina, List<T> datosOriginales) {
int totalRegistros = datosOriginales.size();
List<T> subconjuntoDatos = datosOriginales;
if (totalRegistros > elementosPorPagina) {
int desdeIndice = elementosPorPagina * (paginaNumero - 1);
int hastaIndice = Math.min(elementosPorPagina * paginaNumero, totalRegistros);
subconjuntoDatos = datosOriginales.subList(desdeIndice, hastaIndice);
}
Page<T> pagina = new Page<>(paginaNumero, elementosPorPagina);
pagina.addAll(subconjuntoDatos);
pagina.setTotal(totalRegistros);
pagina.setPages((int) Math.ceil((double) totalRegistros / elementosPorPagina));
return new PageInfo<>(pagina);
}
- Extracción manual de elementos por página
Una alternativa más directa, sin depedner de librerías externas, consiste en calcular los índices de inicio y fin para extraer el segmento de datos correspondiente a la página solicitada.
Implementación manual con sublist
/**
* Extrae manualmente los elementos de una página específica.
* @param paginaActual Número de página a obtener
* @param tamanoPagina Cantidad máxima de elementos por página
* @param coleccionDatos Lista completa de datos
* @param <T> Tipo genérico de los elementos
* @return Nueva lista con los elementos de la página solicitada
*/
public static <T> List<T> extraerPagina(int paginaActual, int tamanoPagina, List<T> coleccionDatos) {
if (coleccionDatos == null || coleccionDatos.isEmpty()) {
return new ArrayList<>();
}
int posicionInicial = (paginaActual - 1) * tamanoPagina;
if (posicionInicial >= coleccionDatos.size()) {
return new ArrayList<>();
}
int posicionFinal = Math.min(posicionInicial + tamanoPagina, coleccionDatos.size());
return new ArrayList<>(coleccionDatos.subList(posicionInicial, posicionFinal));
}
- Ejemplo de implementación completa
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import com.github.pagehelper.PageInfo;
public class EjemploPaginacionListas {
public static void main(String[] args) {
// Generar datos de prueba
List<String> datosPrueba = IntStream.rangeClosed(1, 10)
.mapToObj(n -> String.valueOf(n))
.collect(Collectors.toList());
int paginaSolicitada = 1;
int registrosPorPagina = 3;
// Método 1: Usando PageInfo
PageInfo<String> infoPaginacion = obtenerPaginaInfo(paginaSolicitada, registrosPorPagina, datosPrueba);
mostrarResultadosPagina("PageInfo", infoPaginacion.getList(),
infoPaginacion.getTotal(), infoPaginacion.getPageNum(),
infoPaginacion.getPageSize(), infoPaginacion.getPages());
// Método 2: Extracción manual
List<String> elementosPagina = extraerPagina(paginaSolicitada, registrosPorPagina, datosPrueba);
int totalPaginas = (int) Math.ceil((double) datosPrueba.size() / registrosPorPagina);
mostrarResultadosPagina("Extracción manual", elementosPagina, datosPrueba.size(),
paginaSolicitada, registrosPorPagina, totalPaginas);
}
private static <T> void mostrarResultadosPagina(String metodo, List<T> elementos,
long totalRegistros, int paginaActual,
int tamanoPagina, int totalPaginas) {
System.out.println("Método: " + metodo);
System.out.println("Total registros: " + totalRegistros);
System.out.println("Elementos en página: " + elementos);
System.out.println("Página actual: " + paginaActual);
System.out.println("Elementos por página: " + tamanoPagina);
System.out.println("Total páginas: " + totalPaginas);
System.out.println("=".repeat(30));
}
}