在Java中两个列表的交集
1.概述
在本教程中,我们将学习如何检索两个Lists的交叉点。
与其他许多事情一样,由于在Java 8中引入了streams,这已经变得非常容易了。
2.两个字符串列表的交集
让我们创建两个Lists的Strings,它们有一些交集--都有一些重复的元素。
List<String> list = Arrays.asList("red", "blue", "blue", "green", "red");
List<String> otherList = Arrays.asList("red", "green", "green", "yellow");
而现在我们将在流方法的帮助下确定列表的交集。
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删除重复的元素。然后,我们用过滤器来选择那些也包含在其他列表中的元素。
最后,我们用一个Collector转换我们的输出。交集应该只包含每个公共元素一次。顺序应该不重要,因此toSet是最直接的选择,但我们也可以使用toList或其他收集器方法。
有关详细信息,请查看我们的Java 8 的collectors指南。
3.自定义类列表的交集
如果我们的Lists不包含Strings,而是包含我们创建的自定义类的实例,怎么办?好吧,只要我们遵循Java的惯例,流方法的解决方案对我们的自定义类来说会很有效。
contains方法是如何决定一个特定的对象是否出现在一个列表中?基于equals方法。因此,我们必须覆盖equals方法,并确保它根据相关属性的值对两个对象进行比较。
例如,如果两个矩形的宽度和高度相等,那么这两个矩形就是相等的。
如果我们不覆盖equals方法,我们的类会使用父类的equals实现。在最后,或者说,在继承链的最后,Object类的equals方法被执行。然后,只有当两个实例在堆上引用完全相同的对象时,它们才是相等的。
关于equals方法的更多信息,请参阅我们关于Java equals()和hashCode()合同的文章。
4.总结
在这篇简短的文章中,我们已经看到了如何使用流来计算两个列表的交集。还有许多其他的操作,过去是相当乏味的,但如果我们了解了Java流API的方法,就会变得非常简单了。请看我们的进一步的Java流的教程。
代码示例可在GitHub上获得。