无法理解 Java 8 中的以下 Lambda 方法

Kav*_*Kav 0 java lambda

这个 Lambda 8 方法出现在 leetcode.com 上的一个建议答案中:https ://leetcode.com/problems/merge-intervals/discuss/21222/A-simple-Java-solution

以下是我似乎无法理解的方法:

int[][] intervals = {{8,10}, {1,3},{2,6},{15,18}};

Arrays.sort(intervals, (i1, i2) -> Integer.compare(i1[0], i2[0]));
Run Code Online (Sandbox Code Playgroud)

我知道Arrays.sort()按升序对数组进行排序,第二个参数应该是它对数组进行排序的范围。

我不明白的是 i1 和 i2 参数以及后面的Integer.compare()方法。

究竟是什么i1i2这里?它们是数组还是整数?

我们怎么不写了(int i1, int i2)?这是因为我们后来已经提到了Integer吗?

Amo*_*len 5

我知道 Arrays.sort() 按升序对数组进行排序,第二个参数应该是它对数组进行排序的范围。

那是不正确的。当您阅读javadocs 时,您可以看到第二个参数是一个 Comparator - 定义数组应该如何排序的“规则”的方法。

int[][]是一个整数数组的数组。如果您采用其中的单个元素,它将是 ints - 的普通数组int[]。这就是您要在 sort 方法中比较的元素,即 whati1i2are。但那些只是在 lambda 内部使用的变量名——那些可以是其他任何东西。

Integer.compare(i1[0], i2[0]) 这需要每个数组的第一个元素并基于它进行比较。

为什么我们不写 (int i1, int i2)?这是因为我们后来已经提到了Integer吗?

该方法定义为public static <T> void sort(T[] a, Comparator<? super T> c)。当您将int[][]第一个参数作为第一个参数传递给它时,编译器假定第二个参数的类型为Comparator<? super int[]>。因此,lambda 的参数int[]也是如此。