Java?List集合取交集的五種常見方式總結(jié)
前言
在Java中,List
集合是用于存儲(chǔ)一系列對(duì)象的數(shù)據(jù)結(jié)構(gòu)。當(dāng)我們要獲取兩個(gè) List
集合的交集時(shí),有多種方法可以實(shí)現(xiàn)。下面將介紹幾種常見的方式。
1. 使用Java 8的Stream API
Java 8引入了Stream API,它提供了一種聲明式的方式來(lái)處理數(shù)據(jù)。
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class ListIntersection { public static void main(String[] args) { List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5); List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8); List<Integer> intersection = list1.stream() .filter(list2::contains) .collect(Collectors.toList()); System.out.println("Intersection: " + intersection); } }
這段代碼首先創(chuàng)建了兩個(gè) List
對(duì)象 list1
和 list2
。然后,通過(guò) list1.stream()
獲取 list1
的Stream對(duì)象,并使用 filter
方法篩選出同時(shí)存在于 list2
中的元素。最后,使用 collect
方法將結(jié)果轉(zhuǎn)換回 List
對(duì)象。
2. 使用Java的retainAll方法
retainAll
方法是 Collection
接口的一部分,它可以用來(lái)保留在指定集合中也存在的元素。不過(guò),retainAll
方法會(huì)直接修改調(diào)用它的集合,因此在使用前需要?jiǎng)?chuàng)建一個(gè)副本。
import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class ListIntersection { public static void main(String[] args) { List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)); List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8); List<Integer> intersection = new ArrayList<>(list1); intersection.retainAll(list2); System.out.println("Intersection: " + intersection); } }
這段代碼創(chuàng)建了兩個(gè) List
對(duì)象 list1
和 list2
,然后將 list1
的一個(gè)副本賦值給 intersection
。接著,調(diào)用 retainAll
方法來(lái)保留 intersection
中也存在于 list2
中的元素。
3. 使用Apache Commons Collections庫(kù)
如果你使用的是Apache Commons Collections庫(kù),那么可以利用 CollectionUtils
類提供的 intersection
方法來(lái)更簡(jiǎn)單地求取交集。
import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import java.util.Arrays; import java.util.List; public class ListIntersection { public static void main(String[] args) { List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5); List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8); List<Integer> intersection = (List<Integer>) CollectionUtils.intersection(list1, list2); System.out.println("Intersection: " + intersection); } }
這段代碼首先引入了Apache Commons Collections庫(kù)的相關(guān)類,然后利用 CollectionUtils.intersection
方法來(lái)直接求取兩個(gè) List
的交集。注意這里需要對(duì)返回的集合進(jìn)行類型轉(zhuǎn)換。
4.使用Java 8的并行流(Parallel Streams)
如果說(shuō)你的數(shù)據(jù)量很大,或者你的機(jī)器有多個(gè)處理器核心,你可以考慮使用并行流來(lái)加速交集的計(jì)算。
List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5); List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8); Set<Integer> set2 = new HashSet<>(list2); // 使用HashSet提高查找效率 List<Integer> intersection = list1.parallelStream() .filter(set2::contains) .collect(Collectors.toList());
注意:大數(shù)據(jù)量下,會(huì)比較適合使用并行流
5.使用傳統(tǒng)的for循環(huán)遍歷
import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Set; public class ListIntersection { public static void main(String[] args) { List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5); List<Integer> list2 = Arrays.asList(4, 5, 6, 7, 8); Set<Integer> set1 = new HashSet<>(list1); List<Integer> intersection = new ArrayList<>(); for (Integer num : list2) { if (set1.contains(num)) { intersection.add(num); } } System.out.println("交集:" + intersection); } }
至于這里為什么這么寫,小伙伴們可以去研究下。。。。。(賣個(gè)關(guān)子)
總結(jié)
以上就是在Java中獲取兩個(gè) List
集合交集的幾種方式。你可以根據(jù)具體需求和使用的庫(kù)來(lái)選擇合適的方法。
到此這篇關(guān)于Java List集合取交集的五種常見方式的文章就介紹到這了,更多相關(guān)Java List集合取交集內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java方法遞歸的形式和常見遞歸算法(方法遞歸結(jié)合File類查找文件)
方法遞歸方法直接調(diào)用自己或者間接調(diào)用自己的形式稱為方法遞歸( recursion),遞歸做為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用,這篇文章主要介紹了Java方法遞歸的形式和常見遞歸算法-方法遞歸結(jié)合File類查找文件,需要的朋友可以參考下2023-02-02IDEA上運(yùn)行Flink任務(wù)的實(shí)戰(zhàn)教程
這篇文章主要介紹了IDEA上運(yùn)行Flink任務(wù)的實(shí)戰(zhàn)教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10如何在maven本地倉(cāng)庫(kù)中添加oracle的jdbc驅(qū)動(dòng)
文章介紹了在Maven項(xiàng)目中添加Oracle數(shù)據(jù)庫(kù)驅(qū)動(dòng)ojdbc5時(shí)遇到的問(wèn)題以及解決問(wèn)題的兩種方法,方法一為簡(jiǎn)單粗暴,但沒(méi)有體現(xiàn)Maven倉(cāng)庫(kù)的作用,需要手動(dòng)管理jar包,方法二為在Maven本地倉(cāng)庫(kù)中添加Oracle的JDBC驅(qū)動(dòng),過(guò)程較為繁瑣,但配置一次后可以多次使用2024-11-11Java實(shí)現(xiàn)簡(jiǎn)易俄羅斯方塊
這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)易俄羅斯方塊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06SpringCloud自定義loadbalancer實(shí)現(xiàn)標(biāo)簽路由的詳細(xì)方案
本文介紹了通過(guò)標(biāo)簽路由解決前端開發(fā)環(huán)境接口調(diào)用慢的問(wèn)題,實(shí)現(xiàn)方案包括在本地服務(wù)注冊(cè)元數(shù)據(jù)、自定義負(fù)載均衡器、以及網(wǎng)關(guān)配置等步驟,通過(guò)環(huán)境變量設(shè)置標(biāo)簽,網(wǎng)關(guān)根據(jù)請(qǐng)求頭中的標(biāo)簽進(jìn)行路由,從而實(shí)現(xiàn)前后端互不干擾的開發(fā)調(diào)試,感興趣的朋友一起看看吧2025-02-02通過(guò)volatile驗(yàn)證線程之間的可見性
這篇文章主要介紹了通過(guò)volatile驗(yàn)證線程之間的可見性,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10