86 votes

Goyave: Pourquoi n'y a-t-il pas de fonction Lists.filter ()?

est-ce qu'il y a une raison

 Lists.transform()
 

mais non

 Lists.filter()?
 

Comment filtrer une liste correctement? je pourrais utiliser

 new List(Collection2.filter())
 

Bien sûr, mais de cette façon, il n’est pas garanti que ma commande reste la même, si je comprends bien.

58voto

Dimitris Andreou Points 5398

Il n'était pas mis en œuvre parce qu'il expose un périlleux grand nombre de ralentir méthodes, telles que #get(index) sur le retour de l'affichage de la Liste (en invitant les performances de bugs). Et ListIterator serait difficile à mettre en œuvre (bien que j'ai soumis un patch il y a des années pour couvrir, http://code.google.com/p/guava-libraries/issues/detail?id=110)

Depuis indexé méthodes ne peuvent pas être efficaces dans la Liste filtrée de vue, il est préférable de simplement aller avec un filtrée Itératif, qui n'en ont pas.

37voto

Jon Skeet Points 692016

Vous pouvez utiliser Iterables.filter, ce qui va certainement maintenir la commande.

Notez que par la construction d'une nouvelle liste, vous serez en copie les éléments (juste les références, bien sûr) - afin de ne pas être une vue en direct sur la liste d'origine. Création d'une vue serait assez difficile d'envisager cette situation:

Predicate<StringBuilder> predicate = 
    /* predicate returning whether the builder is empty */
List<StringBuilder> builders = Lists.newArrayList();
List<StringBuilder> view = Lists.filter(builders, predicate);

for (int i = 0; i < 10000; i++) {
    builders.add(new StringBuilder());
}
builders.get(8000).append("bar");

StringBuilder firstNonEmpty = view.get(0);

Qui aurait pour itérer sur l'ensemble de la liste originale, en appliquant le filtre à tout. Je suppose qu'il pourrait exiger que le prédicat correspondant n'a pas changé au cours de la durée de vie de la vue, mais qui n'est pas entièrement satisfaisant.

(C'est juste deviner, vous l'esprit. Peut-être l'un des responsables de Goyave sera puce avec la véritable raison :)

28voto

skaffman Points 197885

Je pourrais utiliser new List(Collection2.filter()) bien sûr, mais de cette façon, il n'est pas garanti que ma commande reste la même.

Ce n'est pas vrai. Collections2.filter() est un paresseusement-évaluées en fonction d' - il ne fait pas de filtre de votre collection jusqu'à ce que vous commencez à accéder à la version filtrée. Par exemple, si vous parcourez la version filtrée, puis les éléments filtrés va sortir de l'itérateur dans le même ordre que l'original de votre collection (moins ceux filtrés, évidemment).

Peut-être que vous pensiez qu'il ne le filtrage à l'avant, exporte ensuite les résultats dans un arbitraire, Collection non ordonnée d'une forme - il n'a pas.

Donc, si vous utilisez la sortie de l' Collections2.filter() comme l'entrée d'une nouvelle liste, puis l'original de votre commande va être conservé.

À l'aide de statique des importations (et l' Lists.newArrayList de la fonction), il devient assez succinct:

List filteredList = newArrayList(filter(originalList, predicate));

Notez que lors de la Collections2.filter ne sera pas avec impatience parcourir la collection sous-jacente, Lists.newArrayList sera - il va extraire tous les éléments de la collection filtrée et de les copier dans un nouveau ArrayList.

12voto

Premraj Points 2931

Comme mentionné par Jon, vous pouvez utiliser Iterables.filter(..) ou Collections2.filter(..) et si vous n'avez pas besoin d'une vue en direct, vous pouvez utiliser ImmutableList.copyOf(Iterables.filter(..)) ou Lists.newArrayList( Iterables.filter(..)) et oui la commande sera maintenue.

Si vous êtes vraiment intéressé à savoir pourquoi une partie, vous pouvez visiter http://code.google.com/p/guava-libraries/issues/detail?id=505 pour plus de détails.

6voto

Holger Brandl Points 124

Pour résumer ce que les autres dit, vous pouvez facilement créer un wrapper générique pour filtrer des listes :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X