使用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
相关产品推荐
相关产品推荐

