Dans un précédent article sur la programmation fonctionnelle, j'avais présenté les Predicate, utilisables en Java pour filtrer des listes selon des tests prédéfinis.
Il se trouve en réalité que ces objets n'aient pas réellement le comportement attendu... En effet, au lieu de simplement constituer une nouvelle liste à partir de celle fournit en paramètre et en écartant les objets ne satisfaisant pas le prédicat, une erreur est levée à chaque négation :
java.lang.IllegalArgumentException: Cannot add Object - Predicate
rejected it
Je trouve ce principe particulièrement étrange : cela implique que le prédicat ne permettra donc jamais de constituer une nouvelle liste... Pourquoi ne pas se contenter de renvoyer true/false sur le test? La question a également été soulevée sur ce forum, sans vraiment de suite...
Afin de contourner ce problème et d'obtenir réellement le comportement de filtre sur la liste, il faut utiliser l'objet org.apache.commons.collections.iterators.FilterIterator
comme ceci :
List<Integer> list = Arrays.asList(5,8,12,11,65,2); FilterIterator it = new FilterIterator(list.iterator(), new Predicate() { @Override public boolean evaluate(Object arg0) { return ((Integer)arg0).intValue()>10; } }); while(it.hasNext()) { System.out.println(it.next); } // Affichera : 12,11,65
Donc peut-être ai-je mal compris le fonctionnement des Predicate mais je pense que leur documentation gagnerait à expliciter ce genre de comportement...