长流过滤

jei2mxaa  于 2021-07-07  发布在  Java
关注(0)|答案(3)|浏览(155)

这个问题在这里已经有答案了

如何检查两个流是否不相交(3个答案)
上个月关门了。
我有两个java长流,我想从另一个流中删除一个流中的值。

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

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

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

olhwl3o2

olhwl3o21#

嗯,只要流是一组未完成的管道,即操作,就不能在流中搜索。把它与这样的流相比较是没有意义的。
接下来我觉得奇怪的可能是打字错误。我猜你想在 stream1 而不是 stream2 因此:

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

唯一的办法就是比较 LongStream 为这种搜索而优化的集合。我猜你想继续 stream1 执行搜索后,请执行以下步骤:
关闭 stream1 将其转换为 List<Long> list1 .
在中执行搜索 stream2 使用 list1stream1 .
打开 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在他的回答中所建议的那样。

v7pvogib

v7pvogib2#

为什么要使用流呢?
集合具有 retainAll(Collection) 方法,那正是你需要的,如果我没弄错的话。。。
(或 removeAll(Collection) 略高于……)

yqkkidmi

yqkkidmi3#

你可以收集到 Set 使用 contains :

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

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

stream2 = stream2.filter(set1::contains);

相关问题