Fonctionnement et suppression d'un élément du flux

1. Vue d'ensemble

Dans ce rapide didacticiel, nous allons découvrir les différentes façons dont nous pouvons opérer sur un élément dans un flux Java 8, puis le supprimer une fois l'opération terminée.

2. Configuration

Définissons d'abord notre objet Item . Il s'agit d'un objet simple avec un seul champ int .

Il a une méthode qui détermine si l'objet est qualifié pour l'opération, en fonction de la valeur interne:

class Item { private int value; // constructors public boolean isQualified() { return value % 2 == 0; } public void operate() { System.out.println("Even Number"); } }

Nous pouvons maintenant créer une source pour notre Stream qui peut être une collection d' éléments:

List itemList = new ArrayList(); for (int i = 0; i < 10; i++) { itemList.add(new Item(i)); }

3. Filtrage des éléments

Dans de nombreux cas, si nous voulons faire quelque chose avec un sous-ensemble d'éléments, nous pouvons utiliser la méthode de filtrage Stream # , et nous n'avons pas besoin de supprimer quoi que ce soit au préalable:

itemList.stream() .filter(item -> item.isQualified()) ...

4. Fonctionnement et suppression d'un élément

4.1. Collection.removeIf

Nous pouvons utiliser Streams pour itérer et opérer sur la collection d' éléments .

En utilisant Streams , nous pouvons appliquer des fonctions lambda appelées prédicats . Pour en savoir plus sur les flux et les prédicats , nous avons un autre article ici.

Nous pouvons créer un prédicat qui déterminerait si un élément est éligible pour être exploité:

Predicate isQualified = item -> item.isQualified();

Notre prédicat filtrera les éléments sur lesquels nous voulons opérer:

itemList.stream() .filter(isQualified) .forEach(item -> item.operate());

Une fois que nous avons fini d'opérer sur les éléments du flux, nous pouvons les supprimer en utilisant le même prédicat que nous avons utilisé précédemment pour le filtrage:

itemList.removeIf(isQualified);

En interne, removeIf utilise un Iterator pour parcourir la liste et faire correspondre les éléments à l'aide du prédicat. Nous pouvons maintenant supprimer tous les éléments correspondants de la liste.

4.2. Collection.removeAll

Nous pouvons également utiliser une autre liste pour contenir les éléments qui ont été opérés, puis les supprimer de la liste d'origine:

List operatedList = new ArrayList(); itemList.stream() .filter(item -> item.isQualified()) .forEach(item -> { item.operate(); operatedList.add(item); }); itemList.removeAll(operatedList);

Contrairement à removeIf qui utilise un Iterator, removeAll utilise une simple boucle for pour supprimer tous les éléments correspondants de la liste.

5. Conclusion

Dans cet article, nous avons examiné un moyen d'opérer sur un élément dans Java 8 Streams, puis de le supprimer. Nous avons également vu un moyen de le faire en utilisant une liste supplémentaire et en supprimant tous les éléments correspondants.

Le code source de ce didacticiel et les cas de test pertinents sont disponibles à l'adresse over sur GitHub.