Opération sur et suppression d’un élément du flux

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

1. Vue d'ensemble

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

2. Installer

Définissons d'abord notre objetItem. Il s'agit d'un objet simple avec un seul champint.

Sa méthode 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 nosStream qui peut être une collection deItems:

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

3. Filtrage des articles

Dans de nombreux cas, si nous voulons faire quelque chose avec un sous-ensemble d'éléments, nous pouvons utiliser la méthodeStream#filter, 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 utiliserStreams pour itérer et opérer sur la collection deItems.

En utilisantStreams, nous pouvons appliquer des fonctions lambda appeléesPredicates. Pour en savoir plus surStreams etPredicates, nous avons un autre articlehere.

Nous pouvons créer unPredicate qui déterminerait si unItem est qualifié pour être opéré:

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

NosPredicate filtreront lesItems 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 les mêmesPredicate que nous avons utilisés précédemment pour le filtrage:

itemList.removeIf(isQualified);

Internally, removeIf uses an Iterator to iterate over the list and match the elements using the predicate. 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é utilisé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 itérateur,removeAll uses a simple for-loop to remove all the matching elements in the list.

5. Conclusion

Dans cet article, nous avons examiné une méthode permettant d’exploiter un élément dans Java 8 Streams, puis de le supprimer. Nous avons également trouvé 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 correspondants sont disponiblesover on GitHub.