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
検索を実行した後も続行することを想定しているため、次の手順を実行します。
- に
stream1
変換して閉じますList<Long> list1
。 - fromを
stream2
使用list1
して検索を実行しますstream1
。 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)
少し上に...)