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.