为何int数组与Integer数组的distinct计数结果不同?
问题分析:int数组与Integer数组的Stream distinct计数差异
嘿,我懂你为啥困惑了——这个差异完全是Stream.of()的重载逻辑在“搞事情”,咱们一步步拆解开来看:
首先先回顾你的代码和实际输出:
你的代码示例
int[] numbers1 = { 1, 2, 3 }; System.out.println("numbers1: " + Arrays.toString(numbers1)); System.out.println("distinct numbers1 count: " + Stream.of(numbers1).distinct().count()); Integer[] numbers2 = { 1, 2, 3 }; System.out.println("numbers2: " + Arrays.toString(numbers2)); System.out.println("distinct numbers2 count: " + Stream.of(numbers2).distinct().count());
实际运行结果
numbers1: [1, 2, 3]
distinct numbers1 count: 1
numbers2: [1, 2, 3]
distinct numbers2 count: 3
核心原因:Stream.of()对不同数组类型的处理逻辑不同
- 当传入基本类型数组(比如
int[])时,Stream.of()没有对应的基本类型流重载方法,它会把整个数组对象当成一个单独的元素,返回的是Stream<int[]>类型的流。这时候distinct()比较的是数组对象本身(这里只有一个数组),所以计数自然是1。 - 当传入引用类型数组(比如
Integer[])时,Stream.of()会自动将数组拆分成单个元素的流,返回Stream<Integer>类型的流。distinct()会逐个比较数组里的Integer元素,三个元素都不同,所以计数是3。
解决方法:处理基本类型数组用Arrays.stream()
如果要对基本类型数组进行流式操作,应该使用Arrays.stream()方法,它会正确地将基本类型数组转换成对应的基本类型流(比如IntStream):
修改后的代码示例
int[] numbers1 = { 1, 2, 3 }; System.out.println("numbers1: " + Arrays.toString(numbers1)); // 改用Arrays.stream处理基本类型数组 System.out.println("distinct numbers1 count: " + Arrays.stream(numbers1).distinct().count()); Integer[] numbers2 = { 1, 2, 3 }; System.out.println("numbers2: " + Arrays.toString(numbers2)); System.out.println("distinct numbers2 count: " + Stream.of(numbers2).distinct().count());
修改后的运行结果
numbers1: [1, 2, 3]
distinct numbers1 count: 3
numbers2: [1, 2, 3]
distinct numbers2 count: 3
这样就能得到你预期的结果啦!
内容的提问来源于stack exchange,提问作者Arthur Borsboom
相关产品推荐
相关产品推荐

