LongStream-Filterung [Duplikat]
Ich habe zwei Java LongStreams und möchte Werte, die in einem Stream vorhanden sind, aus dem anderen entfernen.
LongStream stream 1 = ...
LongStream stream 2 = ...
stream2 = stream2.filter(e-> stream1.contains(e));
Der LongStream hat keine Includes-Methode und ich weiß in diesem Fall nicht, wie man anyMatch verwendet, da der zu überprüfende Wert aus einem anderen Stream stammt und sich nicht in einer Variablen oder Konstante befindet.
Antworten
Nun, Sie können nicht im Stream suchen, solange Stream ein unfertiger Satz von Pipelines ist, dh Operationen. Es macht keinen Sinn, es mit einem solchen Stream zu vergleichen.
Das nächste, was mir seltsam erscheint, ist wahrscheinlich ein Tippfehler. Ich gehe davon aus, dass Sie in der stream1
statt suchen möchten stream2
, daher:
stream2 = stream2.filter(e -> stream1.contains(e));
Die einzige Möglichkeit besteht darin, a LongStream
mit einer Sammlung zu vergleichen, die für eine solche Suche optimiert ist. Ich gehe davon aus, dass Sie stream1
nach der Suche fortfahren möchten. Führen Sie daher die folgenden Schritte aus:
- Schließen Sie die
stream1
Konvertierung in aList<Long> list1
. - Führen Sie die Suche
stream2
mit vonlist1
ausstream1
. - Zur
stream1
weiteren Bearbeitung erneut öffnen .
LongStream stream1 = ...
LongStream stream2 = ...
List<Long> list1 = stream1.boxed() // list1 from stream1 ..
.collect(Collectors.toList()); // .. which also closes stream1
stream2 = stream2.filter(list1::contains); // perform search
stream1 = list1.stream().mapToLong(l -> l); // open stream1 as LongStream
Edit: Verwenden Sie Set
für eine bessere Performance als @ fps schlägt in seiner Antwort .
Sie könnten zu einem sammeln Set
und verwenden contains
:
LongStream stream1 = ...
LongStream stream2 = ...
Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());
stream2 = stream2.filter(set1::contains);
Warum überhaupt Streams verwenden?
Sammlungen haben die retainAll(Collection)Methode, die genau das tut, was Sie brauchen, wenn ich mich nicht irre ...
(oder removeAll(Collection)
nur ein bisschen darüber ...)