这可能是一个已经问过的问题,但我找不到所需的答案。

我有一个对象集

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]的并集;如果在任何时候当前间隔和累积的并集之间的交集都是非无效的,那么我们知道已经发生了重叠。

10-07 19:24
查看更多