Java中兩個列表的交集
1.概述
在本教程中,我們將學習如何檢索兩個List
的交集。
像許多其他事情一樣,這要歸功於Java 8中流的引入。
2.兩個字符串列表的交集
讓我們創建兩個具有一些交集的String
的List
,它們都具有一些重複的元素:
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上找到代碼示例。
0 條評論,你可以發表評論,我們會進行改進
