LongStreamフィルタリング[重複]

Dec 01 2020

2つのJavaLongStreamがあり、一方のストリームに存在する値をもう一方のストリームから削除したいと思います。

LongStream stream 1 = ...
LongStream stream 2 = ...

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

LongStreamにはcontainsメソッドがなく、チェックする値が別のストリームからのものであり、変数または定数にないため、この場合のanyMatchの使用方法がわかりません。

回答

1 NikolasCharalambidis Dec 01 2020 at 13:59

ストリームが未完成のパイプラインのセット、つまり操作である限り、ストリームを検索することはできません。そのようなストリームと比較するのは意味がありません。

私にとって次に奇妙に思えるのは、おそらくタイプミスです。のstream1代わりに検索したいと思いますstream2。したがって、次のようになります。

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

唯一の方法はLongStream、そのような検索用に最適化されたコレクションとを比較することです。stream1検索を実行した後も続行することを想定しているため、次の手順を実行します。

  1. stream1変換して閉じますList<Long> list1
  2. fromをstream2使用list1して検索を実行しますstream1
  3. stream1さらに処理するために再度開きます。
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

編集:Set @ fpsが彼の回答で示唆しているように、パフォーマンスを向上させるために使用します。

3 fps Dec 01 2020 at 13:48

あなたはに集めてSet使うことができます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

なぜストリームを使用するのですか?

コレクションには、retainAll(Collection)私が間違っていなければ、必要なことを実行するメソッドがあります...
(またはremoveAll(Collection)少し上に...)