Java List集合取交集的五种常见方式总结

1. 使用Java 8的Stream API

Java 8引入了Stream API,它提供了一种声明式的方式来处理数据。

复制代码
	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);  
	    }  
	}

这段代码首先创建了两个 List 对象 list1 和 list2。然后,通过 list1.stream() 获取 list1 的Stream对象,并使用 filter 方法筛选出同时存在于 list2 中的元素。最后,使用 collect 方法将结果转换回 List 对象。

2. 使用Java的retainAll方法

retainAll 方法是 Collection 接口的一部分,它可以用来保留在指定集合中也存在的元素。不过,retainAll 方法会直接修改调用它的集合,因此在使用前需要创建一个副本。

复制代码
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);  
   }  
}

这段代码创建了两个 List 对象 list1 和 list2,然后将 list1 的一个副本赋值给 intersection。接着,调用 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库的相关类,然后利用 CollectionUtils.intersection 方法来直接求取两个 List 的交集。注意这里需要对返回的集合进行类型转换。

4.使用Java 8的并行流(Parallel Streams)

如果说你的数据量很大,或者你的机器有多个处理器核心,你可以考虑使用并行流来加速交集的计算。

复制代码
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());

注意:大数据量下,会比较适合使用并行流

5.使用传统的for循环遍历

复制代码
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);
  }
}
相关推荐
瓯雅爱分享2 小时前
Java+Vue构建的采购招投标一体化管理系统,集成招标计划、投标审核、在线竞价、中标公示及合同跟踪功能,附完整源码,助力企业实现采购全流程自动化与规范化
java·mysql·vue·软件工程·源代码管理
mit6.8244 小时前
[C# starter-kit] 命令/查询职责分离CQRS | MediatR |
java·数据库·c#
诸神缄默不语4 小时前
Maven用户设置文件(settings.xml)配置指南
xml·java·maven
任子菲阳4 小时前
学Java第三十四天-----抽象类和抽象方法
java·开发语言
学Linux的语莫5 小时前
机器学习数据处理
java·算法·机器学习
找不到、了5 小时前
JVM的即时编译JIT的介绍
java·jvm
西瓜er5 小时前
JAVA:Spring Boot 集成 FFmpeg 实现多媒体处理
java·spring boot·ffmpeg
你总是一副不开心的样子(´ . .̫ .6 小时前
一、十天速通Java面试(第三天)
java·面试·职场和发展·java面试
迎風吹頭髮6 小时前
UNIX下C语言编程与实践63-UNIX 并发 Socket 编程:非阻塞套接字与轮询模型
java·c语言·unix
我是华为OD~HR~栗栗呀6 小时前
23届考研-Java面经(华为OD)
java·c++·python·华为od·华为·面试