在理解Java8中的以下Lambda方法时遇到困难

在理解Java8中的以下Lambda方法时遇到困难,java,lambda,Java,Lambda,Lambda 8方法出现在leetcode.com上的一个建议答案中: 以下是我似乎无法理解的方法: int[][] intervals = {{8,10}, {1,3},{2,6},{15,18}}; Arrays.sort(intervals, (i1, i2) -> Integer.compare(i1[0], i2[0])); 我知道Arrays.sort()按升序对数组进行排序,第二个参数应该是它对数组排序的范围 我不理解的是i1和i2参数以及后面的Integer.compa

Lambda 8方法出现在leetcode.com上的一个建议答案中:

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

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

Arrays.sort(intervals, (i1, i2) -> Integer.compare(i1[0], i2[0]));
我知道
Arrays.sort()
按升序对数组进行排序,第二个参数应该是它对数组排序的范围

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

这里的
i1
i2
到底是什么?它们是数组还是整数

为什么我们不写
(inti1,inti2)
?这是因为我们在后面已经提到整数了吗

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

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

int[][]
是一个int数组数组。如果只取其中的一个元素,它将是整数的普通数组-
int[]
。这是您希望在排序方法中比较的元素,这就是
i1
i2
的含义。但这些只是lambda内部使用的变量名,可能是其他任何名称

Integer.compare(i1[0],i2[0])
这将获取每个数组的第一个元素,并基于该元素进行比较

为什么我们不写(inti1,inti2)?这是因为我们在后面已经提到整数了吗


该方法定义为
publicstaticvoidsort(T[]a,Comparator)
sort
方法定义如下:

public static <T> void sort(T[] a, Comparator<? super T> c)

publicstaticvoidsort(T[]a,Comparator第二个参数是用于对数组排序的Comparator。
您尝试排序的数组是二维数组,因此需要提供一个比较器来对大小为2的数组进行排序


使用此lambda表达式,您将比较大小为2的两个数组,
i1
i2
Integer.compare(i1[0],i2[0])
将根据第一个元素比较大小为2的两个数组。

数组。sort
比较器作为第二个参数

比较器
是一个接口,它的实现将采用两个类型为
的元素,并确定哪一个先到。因此,当您需要对非基本类型的元素(如
int
char
等)进行排序时,实现
比较器
接口非常有用

在本例中,需要按
数组进行排序的元素。sort
不是原语,而是由两个元素组成的其他数组,因此它无法对它们进行排序,它需要知道如何进行排序。这就是为什么它将
比较器
实现作为第二个参数提供的原因

您可以看到lambda正在使用数组
i1
i2
,并通过其第一个元素
ix[0]
对它们进行比较,您可以编写
(int[]i1,int[]i2)
,但这不是必需的,因为编译器假定排序
int[][]
的比较器将是
比较器。