You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:07:24