在Java中两个列表的交集

评论 0 浏览 0 2018-12-26

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上获得。

最后更新2022-12-26
0 个评论
标签