在理解Java8中的以下Lambda方法时遇到困难
Lambda 8方法出现在leetcode.com上的一个建议答案中: 以下是我似乎无法理解的方法:在理解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
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[][]
的比较器将是比较器。