这可能是一个已经问过的问题,但我找不到所需的答案。
我有一个对象集
public class MyObject {
private LocalDate dateBeginning;
private LocalDate dateEnd;
public boolean overlap(MyObject otherDate) { /*code to check overlapping*/ }
}
我需要检查Set是否包含要相互重叠的元素。在“old-java”中,我将遍历该集合两次并检查是否存在所有组合,然后在找到它时中断或返回。
如何在Java 8中使用流和lambda做到这一点?
我已经尝试过
reduction()
和filter()
了,但是它们似乎都不起作用.filter((obj1, obj2) -> { if (obj1.overlap(obj2)) return true;}) //doesn't work
最佳答案
正如您在问题中所说的那样,一种可能的解决方案是遍历该集合两次,并确定是否存在任何重叠。因此,我们需要确定的是,对于集合中的任何元素,我们是否可以找到其他不同且重叠的元素。
借助Stream API,您将因此拥有以下优势:
boolean overlap = set.stream()
.anyMatch(
o1 -> set.stream().anyMatch(o2 -> o1 != o2 && o1.overlap(o2))
);
anyMatch
将确定流中是否有任何元素满足给定条件。因此,上面的代码会询问是否有一个o1
,以至于存在一个与o2
不同的o1
(我们可以放心地使用!=
,因为两个对象都来自同一集合)并与之重叠。请注意,这是一个O(n²)实现:该集合被遍历两次。这可能在一次迭代中是可能的:在每次迭代中,保留间隔
[dateBeginning, dateEnd]
的并集;如果在任何时候当前间隔和累积的并集之间的交集都是非无效的,那么我们知道已经发生了重叠。