Utilitaires Commons Collections

De EjnTricks

Dans le cadre de projet, les manipulations sur les listes sont courantes et récurrentes. IL n'est pas rare d'effectuer des tests, de nullité ou de taille par exemple, qui peuvent impacter sur la lisibilité du code, voir de la note de compléxité fournie par Sonar.

Par exemple, il est courant d'effectuer le test suivant.

  List<String> myList = getAList();

  if (null != myList && myList.size() > 0) {
    // Do something
  } else {
    // Do something
  }

Dans ce cas, il est impératif de tester la nullité, mais la compléxité est augmentée. Cet article présente un ensemble de fonctions, dans la classe org.apache.commons.collections4.CollectionUtils, fournis par la librairie, qui va permettre d'externaliser des actions simples.


Hand-icon.png Votre avis

Nobody voted on this yet

 You need to enable JavaScript to vote


Icon-database.png Test de taille

Comme évoqué dans l'introduction, la taille des collections est régulièrement testée. Les deux fonctions isEmpty, pour tester si null ou vide, et isNotEmpty, pour tester si non null et contient au moins un élément, vont permettre de s'affranchir de deux conditions de tests. Le test unitaire fr.ejn.tutorial.apache.commons.collections4.CollectionUtilsTest présente cette utilisation.

  @Test
  public void testIsEmpty() {
    List<String> actual = null;
    Assert.assertTrue("Validate isEmpty on null", CollectionUtils.isEmpty(actual));

    actual = new ArrayList<String>(50);
    Assert.assertTrue("Validate isEmpty on empty, but initialized list", CollectionUtils
        .isEmpty(actual));

    actual.add("String 1");
    Assert.assertFalse("Validate isEmpty on not empty on completed list", CollectionUtils
        .isEmpty(actual));
  }

  @Test
  public void testIsNotEmpty() {
    List<String> actual = null;
    Assert.assertFalse("Validate isNotEmpty on null", CollectionUtils.isNotEmpty(actual));

    actual = new ArrayList<String>(50);
    Assert.assertFalse("Validate isNotEmpty on empty, but initialized list", CollectionUtils
        .isNotEmpty(actual));

    actual.add("String 1");
    Assert.assertTrue("Validate isNotEmpty on not empty on completed list", CollectionUtils
        .isNotEmpty(actual));
  }

Le test sur la taille s'effectue donc en un seul appel de fonction.


Icon-database-init.png Ajout de données

Pour certains projets, il est nécessaire d'effectuer un mapping de données. Il peut être souhaité de ne jamais ajouter de valeur null dans la collection. Ceci entraîne donc l'ajout d'un test de nullité sur l'objet à ajouter de la façon suivante.

  List<String> myList = getAList();

  String value = getValue();
  if (null != value) {
    myList.add(value);
  }

Toujours en terme de compléxité, le test de nullité a ajouter une unité qui est en soit très simple. Mais afin de réduire cette note, il est possible d'utiliser la fonction addIgnoreNull effectue l'ajout de l'objet uniquement si il est non null, comme son nom l'indique.

Le test unitaire fr.ejn.tutorial.apache.commons.collections4.CollectionUtilsTest présente cette utilisation.

  @Test
  public void testAddIgnoreNull() {
    List<String> actual = new ArrayList<String>();

    CollectionUtils.addIgnoreNull(actual, "String 1");
    CollectionUtils.addIgnoreNull(actual, null);
    CollectionUtils.addIgnoreNull(actual, "String 2");

    Assert.assertEquals("Validate list size", 2, actual.size());
    Assert.assertEquals("String 1", actual.get(0));
    Assert.assertEquals("String 2", actual.get(1));
  }