我有两个不同的整数数组:
int arr1[] = [1,2,3,4]
int arr2[] = [2,3,5,6]
如何使用Java 8的Stream API从上述2个数组中找到重复项?
在Java 7中,我做了
public class FindDuplicates {
public static void main(String[] args) {
int arr1[] = {1, 2, 3, 4};
int arr2[] = {2, 3, 5, 6};
// Using two loops to find duplicates
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]);
}
}
}
}
}
3条答案
按热度按时间eit6fx6z1#
为了提高效率,我建议使用set进行缓存。时间复杂度为O(n + m)(其中n和m是arr1和arr2的长度)
(*)
set2::contains
是方法引用,它等价于lambda表达式(x) -> set2.contains(x)
。bqf10yzr2#
输出
在上面的代码中:
Arrays.stream(arr1).boxed()
将int数组arr1转换为Integer对象流。filter()
方法只保留arr1中同时存在于arr2中的数字。collect()
方法将结果收集到列表中。另一种方式是:
*IntStream.of(arr1).boxed():
IntStream.of(arr1)
:这将从arr1
数组创建IntStream
(int
值的流)。.boxed()
:将IntStream
(原始int
s的流)转换为Stream<Integer>
(Integer
对象的流)。*collect(Collectors.toSet()):
collect
方法是一个终端操作,它将流的元素转换为不同类型的结果或可变约简。Collectors.toSet()
是一个收集器,它将输入元素累积到新的Set
中。因此,在boxed()
之后,它将Integer
对象收集到Set<Integer>
中。*.filter(set1::contains):
filter
方法是一个中间操作,允许您根据 predicate 从流中筛选元素。set1::contains
:这是对set1
的contains
方法的方法引用。这意味着IntStream.of(arr2).boxed()
的每个元素都将被传递给set1
的contains
方法,以检查它是否存在于set1
中。如果它存在,则意味着它是arr1
和arr2
之间的公共元素。ars1skjm3#
你也可以使用set来过滤:
如果一个元素已经在set中,那么调用uniqueItems.add(i)将返回false。