Bedienen und Entfernen eines Elements aus dem Stream

Bearbeiten und Entfernen eines Elements aus dem Stream

1. Überblick

In diesem kurzen Tutorial lernen wir die verschiedenen Möglichkeiten kennen, wie wir ein Element in einem Java 8-Stream bearbeiten und nach Abschluss des Vorgangs entfernen können.

2. Konfiguration

Definieren wir zuerst dasItem-Objekt. Dies ist ein einfaches Objekt mit einem einzelnenint-Feld.

Es gibt eine Methode, die basierend auf dem internen Wert bestimmt, ob das Objekt für den Betrieb qualifiziert ist:

class Item {
    private int value;

    // constructors

    public boolean isQualified() {
        return value % 2 == 0;
    }

    public void operate() {
        System.out.println("Even Number");
    }
}

Jetzt können wir eine Quelle für unsereStream erstellen, die eine Sammlung vonItems: sein kann

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

3. Elemente filtern

In vielen Fällen können wir, wenn wir etwas mit einer Teilmenge von Elementen tun möchten, die MethodeStream#filterverwenden, und wir müssen zuerst nichts entfernen:

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

4. Bedienen und Entfernen eines Elements

4.1. Collection.removeIf

Wir könnenStreams verwenden, um die Sammlung vonItems zu iterieren und zu verarbeiten.

MitStreams können wir Lambda-Funktionen anwenden, die alsPredicates bekannt sind. Um mehr überStreams undPredicates zu erfahren, haben wir einen weiteren Artikelhere.

Wir könnenPredicate erstellen, die bestimmen, ob einItem für die Operation geeignet ist:

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

UnserePredicate filtern dieItems, mit denen wir arbeiten möchten:

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

Sobald wir die Elemente im Stream bearbeitet haben, können wir sie mit denselbenPredicate entfernen, die wir zuvor zum Filtern verwendet haben:

itemList.removeIf(isQualified);

Internally, removeIf uses an Iterator to iterate over the list and match the elements using the predicate. Wir können jetzt alle übereinstimmenden Elemente aus der Liste entfernen.

4.2. Collection.removeAll

Wir können auch eine andere Liste verwenden, um die Elemente zu speichern, die bearbeitet wurden, und sie dann aus der ursprünglichen Liste entfernen:

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

Im Gegensatz zuremoveIf, die einen Iterator verwenden,removeAll uses a simple for-loop to remove all the matching elements in the list.

5. Fazit

In diesem Artikel haben wir uns mit der Möglichkeit befasst, ein Element in Java 8 Streams zu bearbeiten und anschließend zu entfernen. Wir haben auch eine Möglichkeit gefunden, indem wir eine zusätzliche Liste verwendet und alle übereinstimmenden Elemente entfernt haben.

Der Quellcode für dieses Tutorial und die relevanten Testfälle sind inover on GitHub verfügbar.