长流过滤

use*_*888 5 java java-stream

我有两个 Java LongStreams,我想从另一个流中删除一个流中存在的值。

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

stream2  = stream2.filter(e-> stream1.contains(e));
Run Code Online (Sandbox Code Playgroud)

LongStream 没有 contains 方法,在这种情况下我不知道如何使用 anyMatch,因为要检查的值来自另一个流,而不是变量或常量。

Nik*_*las 1

好吧,只要 Stream 是一组未完成的管道(即操作),您就无法在 Stream 中进行搜索。与这样的 Stream 相比是没有意义的。

接下来让我觉得奇怪的事情可能是一个拼写错误。stream1我假设您想在 the而不是 中搜索stream2,因此:

stream2 = stream2.filter(e -> stream1.contains(e));
Run Code Online (Sandbox Code Playgroud)

唯一的方法是将 aLongStream与针对此类搜索优化的集合进行比较。stream1我假设您想在执行搜索后继续,因此请执行以下步骤:

  1. 关闭stream1将其转换为List<Long> list1.
  2. stream2使用list1from执行搜索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
Run Code Online (Sandbox Code Playgroud)

编辑:按照@fps在他的回答中建议的那样使用Set以获得更好的性能。