Java中两个List的交集

2023/06/07

1. 概述

在本教程中,我们将学习如何检索两个List的交集

与许多其他事情一样,由于在Java 8中引入了Stream,这变得更加容易。

2. 两个字符串列表的交集

让我们创建两个具有一些交集的List<String>-两者都有一些重复的元素:

List<String> list = Arrays.asList("red", "blue", "blue", "green", "red");
List<String> otherList = Arrays.asList("red", "green", "green", "yellow");

现在我们将借助Stream方法确定列表的交集

Set<String> result = list.stream()
    .distinct()
    .filter(otherList::contains)
    .collect(Collectors.toSet());

Set<String> commonElements = new HashSet(Arrays.asList("red", "green"));

Assert.assertEquals(commonElements, result);

首先,我们使用distinct删除重复的元素。然后,我们使用filter来选择也包含在otherList中的元素。

最后,我们使用Collector转换输出。交集应该只包含每个公共元素一次。顺序无关紧要,因此toSet是最直接的选择,但我们也可以使用toList或其他收集器方法。

有关更多详细信息,请查看我们的Java 8收集器指南

3. 自定义类列表的交集

如果我们的List不是包含String而是包含我们创建的自定义类的实例怎么办?好吧,只要我们遵循Java的约定,使用Stream方法的解决方案就可以很好地用于我们的自定义类。

contains方法如何决定特定对象是否出现在列表中?基于equals方法。因此,我们必须覆盖equals方法并确保它根据相关属性的值比较两个对象

例如,如果两个矩形的宽度和高度相等,则它们是相等的。

如果我们不覆盖equals方法,我们的类将使用父类的equals实现。在最后,或者更确切地说,在继承链结束时,将执行Object类的equals方法。然后,仅当两个实例引用堆上完全相同的对象时,它们才相等。

有关equals方法的更多信息,请参阅我们关于Java equals()和hashCode()契约的文章。

4. 总结

在这篇简短的文章中,我们了解了如何使用Stream来计算两个列表的交集。还有许多其他操作非常乏味,但如果我们知道Java Stream API的方法,它们就非常简单了。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章