如何用Java 8语法结合Comparator.comparing声明Comparator?
如何用Java 8的Comparator.comparing结合var声明指定的Comparator
正确实现代码
直接用链式调用的方式,结合comparingInt和thenComparingInt即可实现你的排序需求:
var c = Comparator.<int[]>comparingInt(arr -> arr[1]) .thenComparingInt(arr -> arr[0]);
代码解释
- 显式指定泛型:
Comparator.<int[]>是为了让编译器明确我们要处理的是int[]类型元素,确保后续Lambda能正确推断参数为int[](省略的话编译器可能无法自动识别类型)。 - 主排序逻辑:
comparingInt(arr -> arr[1])提取每个数组的第二个元素作为排序主键,默认按升序排列,完全对应你原Lambda中o1[1] - o2[1]的逻辑。 - 次级排序逻辑:当主键(第二个元素)相等时,
thenComparingInt(arr -> arr[0])会按数组的第一个元素升序排列,对应原Lambda中o1[0] - o2[0]的逻辑。
完整使用示例
import java.util.Arrays; import java.util.Comparator; public class IntervalSortDemo { public static void main(String[] args) { int[][] intervals = {{1, 3}, {2, 2}, {1, 2}, {3, 4}}; // 用var + Comparator链式方法声明排序器 var c = Comparator.<int[]>comparingInt(arr -> arr[1]) .thenComparingInt(arr -> arr[0]); Arrays.sort(intervals, c); // 打印排序结果 for (int[] interval : intervals) { System.out.println(Arrays.toString(interval)); } // 输出: // [1, 2] // [2, 2] // [1, 3] // [3, 4] } }
为什么用comparingInt而非普通comparing?
普通comparing方法针对实现了Comparable接口的对象类型,而我们操作的是基本类型int,使用comparingInt(及thenComparingInt)可以避免自动装箱/拆箱的性能损耗,同时类型推断更直接准确。
内容的提问来源于stack exchange,提问作者curiousengineer
相关产品推荐
相关产品推荐

