如何使用Java 8 Stream API找出两个整数数组中的重复元素
使用Java 8 Stream API找出两个数组的重复元素
我有两个整数数组:
int arr1[] = {1,2,3,4}; int arr2[] = {2,3,5,6};
已经用Java 7实现了找出重复元素的功能,代码如下:
public class FindDuplicates { public static void main(String[] args) { int arr1[] = {1, 2, 3, 4}; int arr2[] = {2, 3, 5, 6}; // 使用双重循环查找重复元素 for (int i = 0; i < arr1.length; i++) { for (int j = 0; j < arr2.length; j++) { if (arr1[i] == arr2[j]) { System.out.println("Duplicate: " + arr1[i]); } } } } }
用Java 8 Stream API实现的两种方式
方式一:基于Set的高效查找(推荐)
将其中一个数组转换为Set,利用Set的O(1)快速查找特性过滤另一个数组的重复元素,这种方式时间复杂度更低,适合大数据量场景:
import java.util.Arrays; import java.util.Set; import java.util.stream.Collectors; public class FindDuplicatesWithStream { public static void main(String[] args) { int arr1[] = {1, 2, 3, 4}; int arr2[] = {2, 3, 5, 6}; // 将arr1转换为Set,用于快速查找 Set<Integer> arr1Elements = Arrays.stream(arr1) .boxed() // 将int基本类型装箱为Integer .collect(Collectors.toSet()); // 过滤arr2中存在于arr1Elements的元素,同时去重避免重复输出 Arrays.stream(arr2) .boxed() .filter(arr1Elements::contains) .distinct() .forEach(num -> System.out.println("Duplicate: " + num)); } }
方式二:直接通过Stream的anyMatch过滤
这种写法更简洁,但效率和Java 7的双重循环类似(时间复杂度O(n*m)),适合小数据量场景:
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class FindDuplicatesWithStream { public static void main(String[] args) { int arr1[] = {1, 2, 3, 4}; int arr2[] = {2, 3, 5, 6}; // 过滤arr1中存在于arr2的元素,收集为列表后输出 List<Integer> duplicates = Arrays.stream(arr1) .boxed() .filter(num -> Arrays.stream(arr2).anyMatch(n -> n == num)) .collect(Collectors.toList()); duplicates.forEach(num -> System.out.println("Duplicate: " + num)); } }
两种方式的输出结果均为:
Duplicate: 2 Duplicate: 3
内容的提问来源于stack exchange,提问作者Janvi Kadu
相关产品推荐
相关产品推荐

