Java中兩個列表的交集

1.概述

在本教程中,我們將學習如何檢索兩個List的交集。

像許多其他事情一樣,這要歸功於Java 8中流的引入。

2.兩個字符串列表的交集

讓我們創建兩個具有一些交集的StringList ,它們都具有一些重複的元素:

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刪除重複的元素。然後,我們使用filter選擇在otherList中也包含的otherList

最後,我們使用Collector轉換輸出。相交處應僅包含每個公共元素一次。順序無關緊要,因此toSet是最直接的選擇,但是我們也可以使用toList或其他收集器方法。

有關更多詳細信息,請查看我們的Java 8收集器指南。

3.自定義類列表的交集

如果我們的List不包含String而是我們創建的自定義類的實例怎麼辦?好吧,只要我們遵循Java的約定,使用流方法的解決方案就可以很好地用於我們的自定義類。

contains方法如何確定特定對像是否出現在列表中?基於equals方法。因此,我們必須重寫equals方法,並確保它根據相關屬性的值比較兩個對象。

例如,兩個矩形的寬度和高度相等。

如果不重寫equals方法,則我們的類將使用父類的equals實現。在一天的結束,或者更確切地說,在繼承鏈的最後,執行Object類的equals方法。然後,只有兩個實例引用堆上的完全相同的對象時,它們才相等。

有關equals方法的更多信息,請參見關於Java equals()hashCode()合約的文章。

4。結論

在這篇快速文章中,我們已經看到瞭如何使用流來計算兩個列表的交集。如果我們了解Java Stream API的方式,那麼還有許多其他的操作曾經很繁瑣但很簡單。在這裡查看我們有關Java流的更多教程。

可以在GitHub上找到代碼示例。