Aujourd’hui, je vais vous parler d’une méthode disponible dans l’API Guava que je trouve très pratique pour adresser des problématiques de partitionnement d’ensemble.
Je vois deux cas d’utilisations de cette méthode (tiré d’un cas réel) :
– gérer de la pagination,
– Spring batch ( en mode partitionnement).
Cette fameuse méthode fait partie de la classe Lists. Elle a la signature suivante :
public static <T> List<List<T>> partition(List<T> list,int size)
Elle permet à partir d’une liste typée et de la définition d’une taille, d’obtenir un ensemble de listes d’une taille correspondant à la taille définie en paramètre (sauf éventuellement pour la dernière ;-)). Chacune des listes contient un sous-ensemble de la liste passée en paramètre.
Si l’on prend, par exemple, le premier cas de figure évoqué au début de l’article, sur la gestion d’une pagination, on peut se rendre compte de tout l’intérêt d’une telle méthode.
Dans certain cas, cette gestion est faite à la mano :
// En paramètre page courante, nombre d'élément par page
final List<MyElement> elementList = ElementProvider.getAllElement(/*some parameters*/);
totalRecords = elementList.size();
offset = rows * (page – 1);
// Let's avoid showing a blank page, back to first one.
if (totalRecords < offset) {
offset = 0;
page = 1;
}
int start = offset, end, size;
List<MyElement> selectedElements;
do {
size = rows > totalRecords – start ? totalRecords – start : rows;
end = start + size;
selectedElements = size > 0 ? elementList.subList(start, end) : new LinkedList<MyElement>();
doSomething(selectedElements);
start = end;
} while (selectedElements.size() < size && rows == size);
Sans vraiment regarder le détail du code ci-dessus (tiré de la vraie vie), on s’aperçoit que la complexité est là.
On pourrait remplacer ce code par le suivant :
final List<MyElement> elementList = ElementProvider.getAllElement(/*some parameters*/);
List<MyElement> currentElements = Lists.partition(elementList, nbElemeByPage).get(idxCurrentePage);
Remarque : certaines vérifications pour sécuriser le code seront tout de même nécessaires. Néanmoins celles-ci ne remettront pas en cause la simplicité du code
On voit que le code est beaucoup plus clair et concis.
L’autre cas concernant Spring Batch est clairement adapté.
Pour rappel, l’utilisation du partitionnement au sein de spring batch permet de répartir sur plusieurs agents le traitement d’un ensemble de données. En entrée de l’unité de traitement spring Batch, un ensemble. Cet ensemble est découpé en parts égales et distribuées à plusieurs agents (distants ou locaux) pour effectuer de manière cloisonnée et en parallèle un traitement à partir des données.
Dans ce cas, l’utilisation de la méthode de partitionnement est plus qu’évidente.
Voila j’espère que ce court article vous aura fait découvrir un outil qui vous sera utile dans votre quotidien…
A vos marques, prêt ? .. Partitionnez !