LongStream-Filterung [Duplikat]

Dec 01 2020

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

1 NikolasCharalambidis Dec 01 2020 at 13:59

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 stream1statt suchen möchten stream2, daher:

stream2 = stream2.filter(e -> stream1.contains(e));

Die einzige Möglichkeit besteht darin, a LongStreammit einer Sammlung zu vergleichen, die für eine solche Suche optimiert ist. Ich gehe davon aus, dass Sie stream1nach der Suche fortfahren möchten. Führen Sie daher die folgenden Schritte aus:

  1. Schließen Sie die stream1Konvertierung in a List<Long> list1.
  2. Führen Sie die Suche stream2mit von list1aus stream1.
  3. Zur stream1weiteren 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 Setfür eine bessere Performance als @ fps schlägt in seiner Antwort .

3 fps Dec 01 2020 at 13:48

Sie könnten zu einem sammeln Setund verwenden contains:

LongStream stream1 = ...
LongStream stream2 = ...

Set<Long> set1 = stream1.boxed().collect(Collectors.toSet());

stream2 = stream2.filter(set1::contains);
1 UsagiMiyamoto Dec 01 2020 at 14:17

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 ...)