Java?List集合取交集的五種常見方式總結(jié)
前言
在Java中,List
集合是用于存儲一系列對象的數(shù)據(jù)結(jié)構(gòu)。當我們要獲取兩個 List
集合的交集時,有多種方法可以實現(xiàn)。下面將介紹幾種常見的方式。
1. 使用Java 8的Stream API
Java 8引入了Stream API,它提供了一種聲明式的方式來處理數(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)建了兩個 List
對象 list1
和 list2
。然后,通過 list1.stream()
獲取 list1
的Stream對象,并使用 filter
方法篩選出同時存在于 list2
中的元素。最后,使用 collect
方法將結(jié)果轉(zhuǎn)換回 List
對象。
2. 使用Java的retainAll方法
retainAll
方法是 Collection
接口的一部分,它可以用來保留在指定集合中也存在的元素。不過,retainAll
方法會直接修改調(diào)用它的集合,因此在使用前需要創(chuàng)建一個副本。
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)建了兩個 List
對象 list1
和 list2
,然后將 list1
的一個副本賦值給 intersection
。接著,調(diào)用 retainAll
方法來保留 intersection
中也存在于 list2
中的元素。
3. 使用Apache Commons Collections庫
如果你使用的是Apache Commons Collections庫,那么可以利用 CollectionUtils
類提供的 intersection
方法來更簡單地求取交集。
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庫的相關(guān)類,然后利用 CollectionUtils.intersection
方法來直接求取兩個 List
的交集。注意這里需要對返回的集合進行類型轉(zhuǎn)換。
4.使用Java 8的并行流(Parallel Streams)
如果說你的數(shù)據(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ù)量下,會比較適合使用并行流
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); } }
至于這里為什么這么寫,小伙伴們可以去研究下。。。。。(賣個關(guān)子)
總結(jié)
以上就是在Java中獲取兩個 List
集合交集的幾種方式。你可以根據(jù)具體需求和使用的庫來選擇合適的方法。
到此這篇關(guān)于Java List集合取交集的五種常見方式的文章就介紹到這了,更多相關(guān)Java List集合取交集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java方法遞歸的形式和常見遞歸算法(方法遞歸結(jié)合File類查找文件)
方法遞歸方法直接調(diào)用自己或者間接調(diào)用自己的形式稱為方法遞歸( recursion),遞歸做為一種算法在程序設計語言中廣泛應用,這篇文章主要介紹了Java方法遞歸的形式和常見遞歸算法-方法遞歸結(jié)合File類查找文件,需要的朋友可以參考下2023-02-02如何在maven本地倉庫中添加oracle的jdbc驅(qū)動
文章介紹了在Maven項目中添加Oracle數(shù)據(jù)庫驅(qū)動ojdbc5時遇到的問題以及解決問題的兩種方法,方法一為簡單粗暴,但沒有體現(xiàn)Maven倉庫的作用,需要手動管理jar包,方法二為在Maven本地倉庫中添加Oracle的JDBC驅(qū)動,過程較為繁瑣,但配置一次后可以多次使用2024-11-11SpringCloud自定義loadbalancer實現(xiàn)標簽路由的詳細方案
本文介紹了通過標簽路由解決前端開發(fā)環(huán)境接口調(diào)用慢的問題,實現(xiàn)方案包括在本地服務注冊元數(shù)據(jù)、自定義負載均衡器、以及網(wǎng)關(guān)配置等步驟,通過環(huán)境變量設置標簽,網(wǎng)關(guān)根據(jù)請求頭中的標簽進行路由,從而實現(xiàn)前后端互不干擾的開發(fā)調(diào)試,感興趣的朋友一起看看吧2025-02-02