Wie fast jeder, lerne ich immer noch die Feinheiten der neuen Java 8 Streams API (und liebe sie). Ich habe eine Frage bezüglich der Nutzung von Streams. Ich werde ein vereinfachtes Beispiel bereitstellen.Können Java 8-Streams auf einem Objekt in einer Sammlung arbeiten und es dann entfernen?
Java Streams ermöglicht es uns, eine Collection
zu nehmen, und verwenden Sie die stream()
Methode darauf, um einen Strom von all seinen Elementen zu erhalten. Darin gibt es eine Reihe von nützlichen Methoden, wie filter()
, map()
und forEach()
, die es uns ermöglichen, Lambda-Operationen auf den Inhalt zu verwenden.
Ich habe Code, der etwa so aussieht (vereinfacht):
set.stream().filter(item -> item.qualify())
.map(item -> (Qualifier)item).forEach(item -> item.operate());
set.removeIf(item -> item.qualify());
Die Idee ist, eine Zuordnung aller Elemente in der Menge zu erhalten, die eine gewisse Kennzeichnerabgleichung, und dann durch sie arbeiten. Nach der Operation dienen sie keinem weiteren Zweck mehr und sollten aus dem ursprünglichen Satz entfernt werden. Der Code funktioniert gut, aber ich kann das Gefühl nicht loswerden, dass es eine Operation in Stream
gibt, die das für mich in einer einzigen Zeile tun könnte.
Wenn es in den Javadocs ist, kann ich es übersehen.
Kennt jemand mehr mit der API so etwas?
+1 für die Verwendung einer for-Schleife; Verwenden Sie keine Streams, nur damit Sie Ihren Code in einer Zeile platzieren können. Loops sind oft lesbarer als Streaming-Lösungen, auch wenn sie ausführlicher sind. – dimo414
Ich zögere etwas, wenn ich den statusverändernden Code in 'removeIf()' setze, obwohl ich glaube, dass das theoretisch funktionieren würde. Außerdem eignet sich meine Situation für die funktionale Programmierung, so dass mein Bedarf an Streams über das Packen von allem in eine einzige Zeile hinausgeht; aber danke. –
Die Verwendung von 'removeIf' mit Lambda-Ausdruck ist absolut legitim und sollte auf diese Weise verwendet werden. Statusänderung ist Teil der Sammlungs-API, nicht Stream. – hussachai