Moyen facile de filtrer les éléments d'une collection en Java?
Je veux écrire une méthode qui supprime tous les éléments d'une collection qui suivent un certain rythme. Dans les langages fonctionnels, je voudrais utiliser filtre() avec une expression lambda. Toutefois, en Java, il semble que je suis coincé avec ce:
public void removeAllBlueCars() {
LinkedList<Car> carsToRemove = new LinkedList<Car>();
for (Car c : cars) {
if (c.getCarColor() == Color.BLUE) {
carsToRemove.add(c);
}
}
cars.removeAll(carsToRemove );
}
La suppression des éléments de la cause directe d'une ConcurrentModificationException. Est-il une meilleure façon de le faire sans recourir à Google Collections?
- Et vous ne voulez pas utiliser google collections pourquoi? BTW, code.google.com/p/guava-libraries est le nouveau google collections...
- J'aime Google Collections/Goyave, cependant ma question était justement de ne trouver comment faire cela sans avoir recours à des bibliothèques.
- Je me suis amusé ou perturbés par cette notion que lourdement testé et massivement utilisé les bibliothèques sont des choses que nous "le recours à", sans doute en larmes moment de faiblesse. 🙂
- Je pense qu'il veut "BAISER".
Vous devez vous connecter pour publier un commentaire.
Vous pourriez parcourir la liste à l'aide d'un
ListIterator
, qui a un supprimer méthode.Btw, vous devez déclarer votre liste
List<Car>
- programme pour les interfaces, pas de mise en œuvre.Iterator
a déjà unremove
méthode.ListIterator.remove
offre des garanties supplémentaires sur l'interface de base de la méthode, mais à la deuxième case, je vois que j'ai mal compris. Si vous êtes de droite, unIterator
suffirait.Avec Java 8, vous pourrez filtrer avec une lambda expression à l'aide de
de la Collection.removeIf
.Vous pourriez peut-être utiliser des itérateurs, qui sont un peu plus efficace:
Aussi, si vous souhaitez rendre cette solution plus générique, je vous suggère quelque chose comme:
Et vous pouvez l'utiliser comme ceci:
Votre méthode est appelée comme ceci:
Vous pouvez utiliser CollectionUtils.filtre(). Il fonctionne avec une
Iterator
, donc il devrait pas avoir de problèmes de supprimer des éléments directement à partir de laCollection
. C'est une autre dépendance bien. Si vous voulez le code autonome, il serait:Voir si lambdajs'option de filtre peut vous aider.
Vous pouvez toujours revenir en arrière et supprimer les éléments..
edit: Remarqué qu'il était un LinkedList qui pourrait rendre ma réponse un peu non pertinents.
Je suis un grand fan de l'Itérateur solution fournie par Vivien Barousse et gpeche. Mais je tenais à préciser que vous n'avez pas à supprimer des éléments de la collection, vous avez juste besoin d'éviter que le filtre de retour. De cette façon, en gros, vous avez plusieurs vues de la même collection, qui peut être très pratique et efficace. L'objet de Filtre est en fait votre lamda expression, ou aussi près que vous allez obtenir en Java jusqu'à la version 7...
C'est vraiment un vieux post mais comment abt à l'aide de la façon donnée dans Oracle Java tutoriel.
Ici est le Android manière de mettre en œuvre une solution générique pour cette:
Utilisation:
Supprimer toutes les chaînes vides de ma liste
Source:
Avec Java8 l'introduction de les expressions lambda, il est beaucoup plus facile à mettre en œuvre le filtrage sur une collection dans une approche plus fonctionnelle.
J'ai écrit un exemple pour vous. Veuillez également noter comment le plus agréable c'est d'imprimer au contenu de la Collection en utilisant forEach:
Pour ceux d'entre vous qui viennent à travers ce fil et peut-être travailler sur Android avec RxJava/RxAndroid, il existe un moyen rapide de le faire sans l'ajout de l'Apache Commons Collections de dépendance:
Noter que j'ai aussi arriver à être en utilisant les expressions lambda avec Retrolambda. Si vous n'utilisez pas Retrolambda, vous pouvez exprimer la même chose en utilisant les éléments suivants:
Passer d'une liste de certains de type générique de cette fonction avec un prédicat pour supprimer les éléments indésirables.