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

使用Java Streams排序int数组遇到问题求助

Java Streams排序int数组无效的问题解决

你的代码没生效主要有三个核心问题:

  • 流操作是惰性求值:sorted()属于中间操作,没有终端操作(比如toArray())的话,整个流管道根本不会执行,相当于这段代码没起作用。
  • Stream不修改原数据源:Java Stream的所有操作都是非侵入式的,不会改变原始数组arr3的内容,必须把处理后的结果收集成新数组。
  • 冗余的装箱操作:对于基本类型int的流(IntStream),本身就提供了sorted()方法做自然排序,不需要先调用boxed()转成Stream<Integer>,除非你需要自定义排序逻辑。

修正方案1:自然排序(高效版,无装箱)

class Scratch {
    public static void main(String[] args) {
        int[] arr3 = {9, 21, 5, 8};
        // 执行排序并收集为新数组
        int[] sortedArr = Arrays.stream(arr3).sorted().toArray();
        System.out.println(Arrays.toString(sortedArr)); // 输出:[5, 8, 9, 21]
    }
}

修正方案2:自定义排序(比如倒序,需要装箱)

如果需要自定义排序逻辑(比如倒序),才需要装箱后使用Comparator:

class Scratch {
    public static void main(String[] args) {
        int[] arr3 = {9, 21, 5, 8};
        // 自定义倒序比较器
        Comparator<Integer> cc = (e1, e2) -> e2.compareTo(e1);
        Integer[] sortedArr = Arrays.stream(arr3)
                                    .boxed()
                                    .sorted(cc)
                                    .toArray(Integer[]::new);
        System.out.println(Arrays.toString(sortedArr)); // 输出:[21, 9, 8, 5]
    }
}

关键提醒

  • 永远记住:中间操作(sorted()、filter()等)只是定义流的处理逻辑,必须搭配终端操作(toArray()、forEach()等)才会真正执行。
  • 原始数组不会被Stream操作修改,所有结果都是生成新的集合/数组返回。

内容的提问来源于stack exchange,提问作者curiousengineer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 00:42:34