获取两个流的交集,或者判断它们的交集是否为空在 Java 中通常是不可能的,因为流只能使用一次,并且通用解决方案有一个 复杂性。
如果我们对底层供应商的性质一无所知,我们最多可以逃避一个流和一个集合:
<T> boolean intersects(final Stream<T> c1, final Collection<T> c2) {
return c1.filter(c2::contains).findAny().isPresent();
}
不过,如果我们的两个供应商都表示使用相同比较器排序的有序集合(在最简单的情况下,Comparable
的两个 TreeSet
>s)?在这种情况下,解决方案将具有线性复杂性(或者更准确地说,,请参阅 this 答案)。
现在的问题是:能否使用仅 Stream API(即使用两个流作为输入)来实现上述线性解决方案?
最佳答案
您可以将第二个 Stream 收集到 Set
中,然后询问第一个 Stream 的任何元素是否包含在该集合中:
<T> boolean intersects(final Stream<T> c1, final Stream<T> c2) {
return c1.anyMatch(c2.collect(Collectors.toSet())::contains);
}
c1
的集合在其中的元素数量方面是线性的,contains
是一个常数时间操作。
关于java - 查找流交集是否为非空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37463049/