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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 12:03:22